2013-12-15 114 views
1

(請注意,我需要一個SQL Server 2005解決方案)TSQL排序聯盟

我有一個UNION查詢,其中,第一部分以特定的順序返回多行,而第二部分返回一個單行,它必須是結果集的最後一行。

到目前爲止,我發現的最簡單的方法是包含一個額外的「排序」列,但是我不希望此列與數據集一起返回。

請注意,這個例子中的一列,但真正的查詢有許多列,通過動態查詢建...

SELECT [TITLE], 
     (SELECT COUNT(*) FROM dbo.[OTHERTABLE] WHERE ...) AS [VALUE], 
     0 AS [EXTRAORDER] 
FROM dbo.[LOOKUPTABLE] 
UNION 
SELECT 'Total', 
     (SELECT COUNT(*) FROM dbo.[OTHERTABLE]), 
     1 AS [EXTRAORDER] 
ORDER BY [EXTRAORDER], [TITLE] 

我怎樣才能創造這讓所有的列排除EXTRAORDER (最好是沒有手動列出所有需要的列)?

回答

1

除非有人能想出一個更好的解決方案,我目前解決以下.. (我正在走相同的路線,因爲SQLhint.com在他們的回答中,不幸的是他們的答案 - 在撰寫本文時)仍然不正確,因此我無法對它進行調整.行仍然會被排序在主SELECT的結果內,而不是「附加」到最後。)

理想情況下,我想要一個解決方案,不需要需要複製最終數據集中所需的所有列。不幸的是,這個解決方案不能滿足這個要求,但至少它是有效的!

的解決方案是使用CTE ...

; WITH [DATA] AS (
    SELECT [TITLE], 
     (SELECT COUNT(*) FROM dbo.[OTHERTABLE] WHERE ...) AS [VALUE], 
     0 AS [EXTRAORDER] 
    FROM dbo.[LOOKUPTABLE] 
    UNION 
    SELECT 'Total', 
     (SELECT COUNT(*) FROM dbo.[OTHERTABLE]), 
     1 
) 
SELECT [TITLE], [VALUE] 
FROM [DATA] 
ORDER BY [EXTRAORDER], [TITLE] 
+0

內部提供整個'UNION' *來工作(不幸的是,通過複製所有列),我相信所有支持的解決方案都符合您的要求。也就是說,'UNION'首先是排序列,然後是'SELECT'最後(頂部/最外部),排除列列表中的排序列,但仍然在最後一個SELECT中使用它作爲ORDER BY。 AFAIK,沒有其他方法可以在未返回的列上獲得有效的「ORDER BY」。 – RBarryYoung

+0

感謝您的確認@RBarryYoung,我不認爲這將有可能做到這一點,沒有列出其中一列 – freefaller

0

我認爲最好的辦法是回到2個的結果集,但要嚴格對您的問題作出迴應:

SELECT [title], [value] 
FROM 
    (SELECT [TITLE], 
     (SELECT COUNT(*) FROM dbo.[OTHERTABLE] WHERE ...) AS [VALUE], 
     0 AS [EXTRAORDER] 
    FROM dbo.[LOOKUPTABLE] 
    UNION 
    SELECT 'Total', 
     (SELECT COUNT(*) FROM dbo.[OTHERTABLE]), 
     1 AS [EXTRAORDER]) as A 
ORDER BY CASE WHEN [title] = 'Total' THEN 'zzz' ELSE [title] END 
+0

謝謝,但'Total'仍然會在第一個'SELECT'的結果內排序# – freefaller

+0

@freefaller:我更新了腳本。 –

+0

對不起,你的更新是無效的......你不能在子查詢中有ORDER BY' – freefaller

0

這個怎麼樣?

SELECT [TITLE], [VALUE] 
FROM (
    SELECT [TITLE], 
     (SELECT COUNT(*) FROM dbo.[OTHERTABLE] WHERE ...) AS [VALUE] 
    FROM dbo.[LOOKUPTABLE] 
    UNION 
    SELECT 'Total', 
     (SELECT COUNT(*) FROM dbo.[OTHERTABLE]) 
) [DATA] 
ORDER BY (case when [TITLE] = 'Total' then 1 else 0 end), [TITLE] 

這去除根據[標題]中的[EXTRAORDER]列,但仍令治療「合計」作爲最後一個項目。