【问题标题】:Dynamic pivot unknown number of rows - Sql View动态枢轴未知行数 - Sql View
【发布时间】:2020-01-11 02:37:59
【问题描述】:

我正在使用 SQL 从下表中创建数据库视图。

ItemCode                |BcdName           |BcdCode      |
------------------------|------------------|-------------|
03616006.ERA            |EAS               |00060914ER   |
03616006.ERA            |EAN               |8053379025831|
02660402.ERA            |EAS               |00060936ER   |
02660402.ERA            |EAN               |8053379026227|
02660402.ERA            |EANBULK           |00060936ET   |

我需要旋转 BcdName(对于未知数量的列)并获得以下结果:

ItemCode                |EAN               |EAS          |EANBULK      |
------------------------|------------------|-------------|-------------|
03616006.ERA            |8053379025831     |00060914ER   |             |
02660402.ERA            |8053379026227     |00060936ER   |00060936ET   |

在此处找到的解决方案:dynamic pivot issue in sql server 2012 is not working on a table View。

【问题讨论】:

  • 您不能在视图中使用 DYNAMIC SQL。它真的需要动态吗?你能确定一组已定义的列吗?
  • 我更喜欢处理一组动态值。我可以通过将列数限制为 5(EAN、EAS、EANBULK、EASBULK、[EMPTY])来获得所需的结果吗?

标签: sql sql-server pivot


【解决方案1】:

如果您愿意接受带有“警告/未定义”列的已定义列

示例

Select * 
 From  (Select ItemCode
              ,Item     = case when [BcdName] in ('EAN','EAS','EANBULK','EASBULK') then BcdName else 'Empty' end
              ,Value    = [BcdCode]
          From YourTable
       ) src
 Pivot (max(Value) for Item in ([EAN],[EAS],[EANBULK],[EASBULK],[EMPTY]) ) Pvt

退货

ItemCode        EAN             EAS         EANBULK     EASBULK EMPTY
02660402.ERA    8053379026227   00060936ER  00060936ET  NULL    SomeValue
03616006.ERA    8053379025831   00060914ER  NULL        NULL    NULL

【讨论】:

  • 超级简洁的解决方案!谢谢!
  • @MirkoNardi 总是乐于提供帮助
【解决方案2】:

在这里呼应@John 的评论。

基于枢轴语句的视图必须包含硬编码到其中的特定“枢轴值”,这意味着您必须在创建视图时知道它们。根据引用的答案(我敢肯定是数百个中的一个),“动态”选择数据透视列的唯一方法是使用动态 SQL,CREATE VIEW 语句不能包含动态 SQL。

【讨论】:

  • 事实上,我已经找到了数百个使用动态 sql 的示例。奇怪的是没有办法解决这个问题......
  • 同意。我不知道意见,但这是一个很常见的问题,你会认为 MS 会想出一些东西来提供帮助。毕竟,他们连接到临时表中......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多