TSQL Sort Union基于未返回的列

时间:2013-12-15 15:28:50

标签: tsql sql-server-2005 union

(请注意,我需要SQL Server 2005解决方案)

我有一个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]

如何创建此列,以便返回 {/ em> EXTRAORDER以外的所有列<(优选,不用手动列出所有需要的列)?

2 个答案:

答案 0 :(得分:1)

除非有人能提出更好的解决方案,否则我现在已经解决了以下问题......

(我正在沿着与SQLhint.com相同的路线前往他们的答案。不幸的是他们的答案 - 在撰写本文时 - 仍然是不正确的,因此我无法支持它。Total行仍将是在主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]

答案 1 :(得分: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]列,但仍然根据[TITLE]处理'Total'作为最后一项。