Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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
Sql 从max查询中选择列名_Sql_Sql Server_Tsql_Sql Server 2008 - Fatal编程技术网

Sql 从max查询中选择列名

Sql 从max查询中选择列名,sql,sql-server,tsql,sql-server-2008,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,

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

 ;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
查询工作正常,但我想知道最大(金额)来自哪里

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

有办法吗

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


使用SQL Server 2008不使用最大值:使用TOP避免聚合/分组方式

它还可以使用领带处理重复项

我不确定您拥有的是psuedo代码还是子查询,但这应该满足您的需要

 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次,因为子查询只返回一个值。我也看不到行数解决方案(但可能有一个…:-)

这是未经测试的:但是要查看数据的情况,这可能会有所帮助。不是真正的生产代码质量:

SELECT  RowNumber, ObjectID,
        (
        SELECT  MAX(Amount)
        FROM    (
                SELECT str([Col1]) + ", col1, " AS Amount
                UNION ALL
                SELECT str([Col2]) + ", col2" 
                UNION ALL
                SELECT str([Col3]) + ", col3"
                UNION ALL
                SELECT str([Col4]) + ", col4"
                )
        WHERE   Amount > 0
        )
FROM    table
str()是DBMS的“toString()”函数。 您的SQL看起来很奇怪,您使用的是什么DBMS?

添加一个步骤


您可以使用和的组合:

结果:

RowNumber   ObjectID    ColName   ColAmount
----------- ----------- --------- -----------
1           1           Col2      20
2           2           Col4      50

如果Col1和Col2都有相同的MAX怎么办:可能是其中一个…?希望您不介意我刚刚编辑了您的代码,使其成为一个可运行的示例,因为我以前从未见过这种方法。请随意回滚@马丁:我对编辑没意见。让人们更容易回答。谢谢你,他的问题是每行做一次。马丁·史密斯:这是可行的,但我不知道如何获得columnname,因为它是只允许一个值的子查询。请看这些链接:或者说,是的,以前从未见过。谢谢你的链接!谢谢你的帮助。这是一个子查询,完整查询比这个长,并且有4个以上的列,我可以得到它们的名称。这个查询不会反复运行,所以我不担心效率。我只想要准确的结果。我将在完整查询中尝试您的解决方案,并将其标记为已接受,如果我可以使其像那样工作。+1。我也从未见过这种类型的列引用。您必须使用
Amount>“0”
,但这非常简洁+1这是一种聪明的方法。没有考虑过将列名附加为那样的字符串。谢谢,这也很干净,甚至比字符串更整洁:固定长度“编码”谢谢,这是最好的解决方案。我不知道UNPIVOT函数,但它正是我想要的。
;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,
  ColName,
  ColAmount
FROM t
OUTER APPLY (
  SELECT TOP 1 
    ColName,
    ColAmount
  FROM 
    (
      SELECT
        Col1,
        Col2,
        Col3,
        Col4
    ) x 
    UNPIVOT (
      ColAmount FOR ColName IN (Col1, Col2, Col3, Col4) 
    ) y
   WHERE ColAmount > 0
   ORDER BY ColAmount DESC
 ) z
RowNumber   ObjectID    ColName   ColAmount
----------- ----------- --------- -----------
1           1           Col2      20
2           2           Col4      50