【问题标题】:Return column name of max value in a row SQL Server返回一行中最大值的列名 SQL Server
【发布时间】:2025-11-28 07:05:01
【问题描述】:

初始表:

    Name    Job1    Job2     Job3     Job4     Job5     Job6
--------------------------------------------------------------
    A        34       0        66      0        0       0
    B        33       33       33      1        0       0
    C        100      0         0      0        0       0
    D        50       0         0      0        0       50

输出表:

    Name    Max           Job1     Job2     Job3     Job4     Job5     Job6
----------------------------------------------------------------------------
    A       Job3            34       0        66      0        0       0
    B       Job1;Job2;Job3  33       33       33      1        0       0
    C       Job1            100      0         0      0        0       0
    D       Job1;Job6       50       0         0      0        0       50

我需要获取 SQL Server 中具有最大值的行的作业名称(列名)。 由于 SQL 中没有“最大”功能,是否有其他方法可以执行此操作? (因为我至少有 50 个工作)

【问题讨论】:

  • 修复你的设计,就是解决方案。应该有 1 个工作列,而不是 50 个。
  • 正如@Larnu 所说,您的设计不是最好的,但是如果您必须为这些表这样做,我建议先将每个名称插入临时/工作表,并将所有工作放在单独的行中,然后做最大。或者使用 CASE 语句(但这不好且慢)
  • 其实我有不同部门的人。所以 Div1 有 Job1/2/3 而其他工作是 NULL,Div2 有 Job1/2/3/5/6 等等。每个人在每项工作中都有不同的产出。所以要么我可以有多行,每行有一个工作和容量,或者我可以有这样的设计。所以,案例陈述太慢了。
  • “所以要么我可以有多行,每行有一个 Job 和容量” 这就是正是你应该去的。 MAX(JobValue)(SELECT MAX(JobValue) FROM (VALUES(Job1, Job2, Job3, ... Job49, Job50)V(JobValue)) 容易得多

标签: sql sql-server


【解决方案1】:

您可以使用apply 和窗口函数:

select t.*, max_cols
from t cross apply
     (select string_agg(colname, ';') as max_cols
      from (select top (1) with ties v.colname
            from (values ('Job1', t.job1), ('Job2', t.job2), . . . 
                 ) v(colname, job)
            order by v.job desc
           ) v
     ) v;

也就是说,您可能应该修复您的数据模型。具有相同信息的多个列通常表示数据模型不足。每个name/job 组合应该是另一个表中的单独行。

【讨论】:

    最近更新 更多