(请注意,我需要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
以外的所有列<(优选,不用手动列出所有需要的列)?
答案 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'作为最后一项。