【问题标题】:Flatten table rows by combining certain values into columns通过将某些值组合到列中来展平表格行
【发布时间】:2014-04-20 01:21:57
【问题描述】:

我正在尝试构建一个用于报告目的的视图,并且无法通过将几个值组合成列来展平结果以将通常多行显示为单行的内容。每个组织都有两个管理员,并希望将他们都显示在同一行中。查询如下:

SELECT dbo.Organization.OrganizationName,
       CASE 
        WHEN (dbo.OrganizationUser.AdminOrder = 1) 
        THEN dbo.OrganizationUser.UserID 
        ELSE '' 
       END AS Admin1,
       CASE 
        WHEN (dbo.OrganizationUser.AdminOrder = 2) 
            THEN dbo.OrganizationUser.UserID 
        ELSE '' 
       END AS Admin2
FROM   dbo.Organization 
INNER JOIN dbo.OrganizationUser 
    ON dbo.OrganizationUser.OrganizationId = dbo.Organization.OrganizationId
WHERE  dbo.OrganizationUser.UserType = 'ADMIN'  

问题是,我得到 2 行看起来像

Organization1 - User1   - <empty>
Organization1 - <empty> - User2

我无法合并行。

【问题讨论】:

  • 您的数据库是否支持数据透视函数?它将允许您将行转换为列。

标签: sql case flatten


【解决方案1】:

这是一个非常标准的操作;你只是错过了它的后半部分。您需要一个执行合并步骤的环绕查询:

select foo.orgname, max(foo.Admin1), max(foo.Admin2)
from   (SELECT dbo.Organization.OrganizationName as orgname,
               CASE WHEN (dbo.OrganizationUser.AdminOrder = 1) THEN dbo.OrganizationUser.UserID ELSE '' END AS Admin1,
               CASE WHEN (dbo.OrganizationUser.AdminOrder = 2) THEN dbo.OrganizationUser.UserID ELSE '' END AS Admin2
        FROM   dbo.Organization 
         INNER JOIN dbo.OrganizationUser ON dbo.OrganizationUser.OrganizationId = dbo.Organization.OrganizationId
        WHERE  dbo.OrganizationUser.UserType = 'ADMIN') foo
group  by foo.orgname

【讨论】:

  • 不客气。请注意,我们通常不会在 StackOverflow 上说“谢谢”,而是赞成和/或接受响应者的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 2016-03-20
  • 2019-04-14
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多