sql - 从最大查询中选择列名

标签 sql sql-server tsql sql-server-2008

我有一个类似这样的查询:

 ;WITH t as
(
select 1 as RowNumber, 1 as ObjectID, 10 as [Col1],  20 as [Col2],  20 as [Col3],  20 as [Col4] UNION ALL
select 2 as RowNumber, 2 as ObjectID, 20 as [Col1],  30 as [Col2],  40 as [Col3],  50 as [Col4]
)
SELECT  RowNumber, ObjectID,
        (
        SELECT  MAX(Amount)
        FROM    (
                SELECT  [Col1] AS Amount
                UNION ALL
                SELECT  [Col2]
                UNION ALL
                SELECT  [Col3]
                UNION ALL
                SELECT  [Col4]
                ) d
       WHERE   Amount > 0
        )
FROM    t

查询工作正常,但我想知道 Max(Amount) 来自哪里。

因此,在我的结果集中,除了 (RowNumber、ObjectId、Amount) 之外,我还希望将列的名称 (Col1、Col2、Col3、Col4) 作为字符串。

有什么办法可以做到这一点吗?

编辑 评论中的问题:如果两列具有相同的最大值,则可能是其中之一?是的,可能是其中之一。只要我知道它来自哪里,任何列名称都可以。

使用 SQL Server 2008

最佳答案

不要使用 MAX:使用 TOP 可以避免聚合/GROUP BY。

它还可以使用WITH TIES处理重复项

我不确定您拥有的是伪代码还是子查询,但这应该可以满足您的要求

 SELECT TOP 1 -- WITH TIES if needed
     *
 FROM
     (
     SELECT  RowNumber, ObjectID, [Col1] AS Amount, 'Col1' AS ColName
     FROM table
     UNION ALL
     SELECT  RowNumber, ObjectID, [Col2], 'Col2' AS ColName
     FROM table
     UNION ALL
     SELECT  RowNumber, ObjectID, [Col3], 'Col3' AS ColName
     FROM table
     UNION ALL
     SELECT  RowNumber, ObjectID, [Col4], 'Col4' AS ColName
     FROM table
     ) foo
 WHERE   Amount > 0
 ORDER BY Amount DESC

你的主要问题是,无论你怎么做,你都必须接触表 4 次,因为子查询只返回一个值。我也看不到 ROW_NUMBER 解决方案(但可能有一个...:-)

关于sql - 从最大查询中选择列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3842631/

相关文章:

sql - Access Jet SQL INT() 函数 -> SQL Server 函数

sql - 存储过程所有权链接

sql-server - SQL:将多行结果显示为 1 行

python - 使用两个不同且独立的表格进行计算的最佳方法是什么?

sql - SQL中如何复制表避免游标?

sql-server-2005 - SQL Server 列之间的逗号分隔值

c# - (当用户输入数据时mySQL行锁c#

sql - 在HIVE SQL中替换NULL或空值的函数

sql - 插入到子类型列为 : Type Inheritance, 的表中 面向对象的 SQL

sql - 在相关子查询上使用 EXISTS 运算符的说明