Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于未返回列的TSQL排序联合_Tsql_Sql Server 2005_Union - Fatal编程技术网

基于未返回列的TSQL排序联合

基于未返回列的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],

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

我有一个
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的确认,我认为如果不列出除一列以外的所有列,就不可能做到这一点