【问题标题】:Pivot table in SQL Server 2016SQL Server 2016 中的数据透视表
【发布时间】:2020-10-01 21:49:41
【问题描述】:

我在 SQL Server 2016 中透视表时遇到问题。请考虑以下数据/查询


WITH DATA1 AS
(
   SELECT 123 cid, 'test' cname, '2020-03-17' dt,   'BELLE' fc,     3782703 mn union all
  SELECT 123 cid, 'test' cname, '2020-03-12' dt,    'WOO' fc,       25679 mn union all

  SELECT 345 cid, 'test2' cname, '2019-03-17' dt,   'king' fc,      3782703 mn union all
  SELECT 345 cid, 'test2' cname, '2019-03-12' dt,   'east' fc,      25679 mn union all

  SELECT 111 cid, 'test3' cname, '2019-02-12' dt,   'east' fc,      2 mn
)
select *
 from DATA1
 PIVOT (
     MAX(mn)  FOR fc IN (
      [BELLE]   
      ,[WOO] 
      ,[KING]
      ,[EAST]  
       ) 
) a

我正在尝试以 dt 和 mn 为中心来获取 fc 中的值。所以基本上我正在寻找这个输出。

cid       cname    fc1_dt        fc1_name   fc1_mn    fc2_name   fc2_dt        fc2_mn   
123       test      2020-03-17   BELLE      3782703     woo        2020-03-12    25679
345       test2    2019-03-17    king       37          east       2019-03-12    25
111       test3     2019-02-12   east        2

我试图像这样添加到max 函数,但它不起作用

 PIVOT (
     MAX(mn),max(dt)  FOR fc IN (
      [BELLE]   
      ,[WOO] 
      ,[KING]
      ,[EAST]  
       ) 
) a

有人可以帮忙修改我的查询以产生上面的输出吗?

【问题讨论】:

    标签: sql sql-server datetime pivot window-functions


    【解决方案1】:

    一个选项使用row_number() 和条件聚合。假设您想要第一列中的最新日期:

    select cid, cname,
        max(case when rn = 1 then dt end) fc1_dt,
        max(case when rn = 1 then fc end) fc1_name,
        max(case when rn = 1 then mn end) fc1_mn,
        max(case when rn = 2 then dt end) fc2_dt,
        max(case when rn = 2 then fc end) fc2_name,
        max(case when rn = 2 then mn end) fc2_mn
    from (
        select d.*, row_number() over(partition by cid, cname order by dt desc) rn
        from data1 d
    ) d
    group by cid, cname
    

    如果您希望每组处理超过 2 行,则需要使用更多条件表达式扩展 select 子句。

    Demo on DB Fiddle

    西德 |名称 | fc1_dt | fc1_name | fc1_mn | fc2_dt | fc2_name | fc2_mn --: | :---- | :--------- | :------- | ------: | :--------- | :------- | -----: 123 |测试 | 2020-03-17 |美女 | 3782703 | 2020-03-12 |呜 | 25679 345 |测试2 | 2019-03-17 |国王 | 3782703 | 2019-03-12 |东| 25679 111 |测试3 | 2019-02-12 |东| 2 | | |

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2017-11-25
      • 2012-02-22
      • 1970-01-01
      相关资源
      最近更新 更多