【问题标题】:Dynamic Pivot SQL Server Not Showing Value动态数据透视 SQL Server 未显示值
【发布时间】:2018-04-23 04:02:55
【问题描述】:

我有下表:

oCode       oDateTime         oValue
---------------------------------------------
A           2017-01-01       10
B           2017-01-01       20
C           2017-01-01       5

我希望得到以下结果:

oDateTime        A         B        C
------------------------------------------------
2017-01-01       10         20       5

如果是静态枢轴,我会使用以下代码:

select 
   *
from 
   (
    select 
       sTag
       , sDateTime
       , sValue
    from #condesarsp
   ) src
   pivot
   (
      sum(sValue)
      for sTag in ([X1], [X2], [X3])
   ) piv
   order by sDateTime;

但不幸的是,oValue 没有显示出来。它只是显示null 值。上面的代码有错别字吗?

之后,我想要动态支点。所以我不需要定义列,它只是从oCode值生成。

需要帮助,谢谢。

【问题讨论】:

    标签: sql sql-server tsql sql-server-2014


    【解决方案1】:

    首先,您需要指定 max() 函数而不是 sum() 和其他 sTag 的值应该是 [A]、[B]、[C] 而不是 [X1]..[X3]

    select *
    from 
    (
        select 
               oCode, oDateTime, oValue
        from table
    ) src pivot(
          max(oValue)
          for ocode in ([A], [B], [C])
    ) piv
    order by 1;
    

    【讨论】:

      【解决方案2】:

      是的,您的查询中有一些错误。您必须提供oCode 之类的A,B,C 而不是[X1], [X2], [X3]。像这样:

      for sTag in (A, B, C)
      

      所以修正后的代码是:

      select 
         *
      from 
         (
          select 
             oCode
             , oDateTime
             , oValue
          from condesarsp
         ) src
         pivot
         (
            sum(oValue)
            for oCode in (A, B, C)  -- This line is changed.
         ) piv
         order by oDateTime;
      

      点击演示链接:

      http://sqlfiddle.com/#!18/06a9d/3

      动态查询:

      DECLARE @cols AS NVARCHAR(MAX),
          @query  AS NVARCHAR(MAX)
      
      SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.oCode) 
                  FROM condesarsp c
                  FOR XML PATH(''), TYPE
                  ).value('.', 'NVARCHAR(MAX)') 
              ,1,1,'')
      
      set @query = 'SELECT oDateTime, ' + @cols + ' from 
                  (
                      select oCode
                             ,oDateTime
                             ,oValue
                      from condesarsp
                 ) x
                  pivot 
                  (
                       sum(oValue)
                      for oCode in (' + @cols + ')
                  ) p '
      
      
      execute(@query);
      

      点击演示链接:

      http://sqlfiddle.com/#!18/06a9d/7

      【讨论】:

      • 这太棒了!干杯,
      猜你喜欢
      • 2014-10-16
      • 2014-07-26
      • 1970-01-01
      • 2013-02-09
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      相关资源
      最近更新 更多