【问题标题】:Pivot and left join枢轴和左连接
【发布时间】:2019-07-11 05:42:11
【问题描述】:

T-SQL,在透视时需要帮助在列中组合 2 个值。

我有一个包含以下数据的 Employee 表 -

EmpId   Status  L#
E1      A       1
E1      B       1
E2      A       2
E2      B       2
E3      B       3
E3      C       3
E3      D       3

和一个主管表 -

EmpId   Sup
E1      S1
E2      S2
E3      S3

当状态为 B 或 C 时,我想合并 L# 的值

EmpId   Sup   A   B,C   D
E1      S1    1   1     0
E2      S2    1   2     0
E3      S3    0   2     1

【问题讨论】:

  • 您的预期输出显示 5 列,但只有 4 列标题。请修复您的数据。
  • 您使用的是哪个数据库? oracle 或 sqlserver
  • 谢谢蒂姆。标题已关闭。我离开加入了员工表和主管表。所以 Employee 表中的 4 列和 Supervisor 表中的 1 列(Sup)。
  • @Ajay2707, SQLserver
  • @JHegde 在您的预期结果中,E2->S2->A 的值是1 不应该是2,如果您正在计算,那么值E2->S2->B,C 应该是1 而不是2。请澄清

标签: sql sql-server tsql pivot left-join


【解决方案1】:

只需使用条件聚合。我有点不清楚结果是什么。以下对状态进行计数:

select s.empid, s.sup,
       sum(case when status = 'A' then 1 else 0 end) as a,
       sum(case when status in ('B', 'C') then 1 else 0 end) as bc,
       sum(case when status = 'D' then 1 else 0 end) as d
from employee e join
     supervisor s
     on e.empid = s.empid
group by s.empid, s.sup;

【讨论】:

    【解决方案2】:

    这可能会有所帮助

    DECLARE @TableEmp TABLE (EmpId VARCHAR(10),   Status VARCHAR(10),  L# INT)
    INSERT INTO @TableEmp VALUES
    ('E1',  'A',   1    ),
    ('E1',  'B',   1    ),
    ('E2',  'A',   2    ),
    ('E2',  'B',   2    ),
    ('E3',  'B',   3    ),
    ('E3',  'C',   3    ),
    ('E3',  'D',   3    )
    
    
    DECLARE @TableSup TABLE(EmpId VARCHAR(10),  Sup VARCHAR(10))
    INSERT INTO @TableSup VALUES
    ('E1',  'S1'),
    ('E2',  'S2'),
    ('E3',  'S3')
    
    SELECT EmpId, Sup ,ISNULL(A,0) A, ISNULL(B,0) B,ISNULL(C,0) C,ISNULL(D,0) D
    FROM(
        SELECT e.EmpId, Sup,Status,ISNULL(L#,0) L#
        FROM @TableEmp e
        LEFT JOIN @TableSup s ON e.EmpId = s.EmpId
    ) p
    PIVOT(
      SUM(L#)
      FOR Status IN (A, B, C,D)
    ) piv
    

    【讨论】:

      【解决方案3】:

      下面的查询应该做你想做的事:

      CREATE TABLE #emp (EmpID VARCHAR(10), [Status] VARCHAR(10), L# INT)
      CREATE TABLE #sup (EmpID VARCHAR(10), [Sup] VARCHAR(10))
      INSERT INTO #emp VALUES
      ('E1','A',0),
      ('E1','B',1), 
      ('E2','A',2),
      ('E2','B',2),
      ('E3','B',3),
      ('E3','C',5),
      ('E3','D',5)
      INSERT INTO #sup VALUES
      ('E1','S1'),
      ('E2','S2'),
      ('E3','S3')
      
      SELECT * FROM (
      SELECT e.EmpID, s.Sup, t.[Status], COUNT(L#) AS [Cnt]
      FROM #emp e
      INNER JOIN #sup s ON e.EmpID = s.EmpID
      CROSS APPLY (VALUES(CASE WHEN e.[Status] IN ('B','C') THEN 'B,C' ELSE e.[Status] END)) AS T([Status])
      GROUP BY e.EmpID, s.Sup, t.[Status] ) A
      PIVOT (MAX([Cnt]) FOR [Status] IN ([A],[B,C],[D])) pvt
      

      结果如下,

      EmpID   Sup   A     B,C   D
      E1      S1    1     1     NULL
      E2      S2    1     1     NULL
      E3      S3    NULL  2     1
      

      【讨论】:

        猜你喜欢
        • 2020-04-28
        • 1970-01-01
        • 1970-01-01
        • 2017-05-15
        • 2015-01-25
        • 1970-01-01
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        相关资源
        最近更新 更多