基于未返回列的TSQL排序联合
(请注意,我需要SQL Server 2005解决方案) 我有一个基于未返回列的TSQL排序联合,tsql,sql-server-2005,union,Tsql,Sql Server 2005,Union,(请注意,我需要SQL Server 2005解决方案) 我有一个UNION查询,其中第一部分按特定顺序返回多行,第二部分返回一行,该行必须是结果集的最后一行 到目前为止,我发现的最简单的方法是包含一个额外的“sort”列,,但我不希望此列随数据集一起返回 请注意,此示例只有一列,但实际查询有许多列,通过动态查询生成 SELECT [TITLE], (SELECT COUNT(*) FROM dbo.[OTHERTABLE] WHERE ...) AS [VALUE],
UNION
查询,其中第一部分按特定顺序返回多行,第二部分返回一行,该行必须是结果集的最后一行
到目前为止,我发现的最简单的方法是包含一个额外的“sort”列,,但我不希望此列随数据集一起返回
请注意,此示例只有一列,但实际查询有许多列,通过动态查询生成
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
)(最好不要手动列出所有需要的列)?我认为最好的方法是返回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
除非有人能想出更好的解决方案,否则我目前的解决方案如下 (我的回答与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]
这个怎么样
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
仍将在第一次SELECT
的结果中排序对不起,但是您的更新无效。。。子查询中不能有ORDER BY
,但这仍然会导致Total
包含SELECT
信息。我在CTEI中拥有整个UNION
,我认为所有受支持的满足您需求的解决方案都必须遵循此模式,从而使其正常工作(不幸的是复制了所有列)。也就是说,UNION
首先使用排序列,然后SELECT
last(最上面/最外面),从列列表中排除排序列,但在最后的SELECT
中仍将其用于ORDER BY
。好了,对于未返回的列,没有其他方法可以通过获得有效的订单。感谢@RBarryYoung的确认,我认为如果不列出除一列以外的所有列,就不可能做到这一点