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