【问题标题】:SQL Pivot in this case?在这种情况下使用 SQL Pivot?
【发布时间】:2011-10-05 17:59:54
【问题描述】:

我正在尝试做这个

DATE             Insurance  Type    Billed  Rate
2/28/2011 0:00   BC/BS      INP     B       0.6383
2/28/2011 0:00   BC/BS      OUT     B       0.5216
2/28/2011 0:00   BC/BS      INP     U       0.1988
2/28/2011 0:00   BC/BS      OUT     U       0.3493
3/31/2011 0:00   BC/BS      INP     B       0.69
3/31/2011 0:00   BC/BS      OUT     B       0.6136
3/31/2011 0:00   BC/BS      INP     U       0.1877
3/31/2011 0:00   BC/BS      OUT     U       0.3567

看起来像这样

Insurance   Type    Billed  2/28/2011 0:00  3/31/2011 0:00
BC/BS       INP     B       0.6383           0.69
BC/BS       OUT     B       0.5216           0.6136
BC/BS       INP     U       0.1988           0.1877
BC/BS       OUT     U       0.3493           0.3567

这样日期字段行数据最终会成为每个不同值的列标题。我想我可以利用 PIVOT 语句,但我看到的所有示例似乎都很简单。

提前致谢。

【问题讨论】:

    标签: sql sql-server pivot


    【解决方案1】:

    如果数据透视列(您的日期)已知,那么您可以使用 PIVOT 运算符来获取结果:

    declare @t table (date datetime, Insurance varchar(10), Type char(3), Billed char(1), Rate decimal(10,4));
    
        insert into @t
            values  ('2/28/2011 0:00',   'BC/BS',      'INP',     'B',       '0.6383'),
                    ('2/28/2011 0:00',   'BC/BS',      'OUT',     'B',       '0.5216'),
                    ('2/28/2011 0:00',   'BC/BS',      'INP',     'U',       '0.1988'),
                    ('2/28/2011 0:00',   'BC/BS',      'OUT',     'U',       '0.3493'),
                    ('3/31/2011 0:00',   'BC/BS',      'INP',     'B',       '0.69'),
                    ('3/31/2011 0:00',   'BC/BS',      'OUT',     'B',       '0.6136'),
                    ('3/31/2011 0:00',   'BC/BS',      'INP',     'U',       '0.1877'),
                    ('3/31/2011 0:00',   'BC/BS',      'OUT',     'U',       '0.3567')
    
        select  *
        from    (   select  [date] as pivot_col, 
                            Insurance, 
                            [Type], 
                            Billed, 
                            Rate 
                    from    @t
                ) as d
        pivot   (   sum(Rate) for pivot_col in ([2/28/2011],[3/31/2011])
                ) as p;
    

    您可能不知道这些值,如果是这种情况,您将需要考虑使用相同的技术但以动态方式。一个很好的例子是here

    【讨论】:

      【解决方案2】:

      根据您提供的示例数据,我猜您会有很长的日期列表,您需要将这些日期转换为列。虽然您可以像其他答案一样使用静态枢轴,但您可以使用类似于下面的动态枢轴:

      DECLARE @cols AS NVARCHAR(MAX),
          @query  AS NVARCHAR(MAX)
      
      select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(char(10), date, 101)) 
                          from test
                  FOR XML PATH(''), TYPE
                  ).value('.', 'NVARCHAR(MAX)') 
              ,1,1,'')
      
      set @query 
            = 'SELECT Insurance, [Type], Billed,' + @cols + ' from 
               (
                  SELECT [date], 
                     Insurance, 
                     [Type], 
                     Billed, 
                     Rate 
                  FROM test
               ) x
               pivot 
               (
                  sum(Rate)
                  for [date] in (' + @cols + ')
               ) p 
               order by billed'
      
      execute(@query)
      

      SQL Fiddle with Demo

      【讨论】:

        猜你喜欢
        • 2011-02-27
        • 2013-11-14
        • 2011-12-06
        • 2015-06-16
        • 1970-01-01
        • 1970-01-01
        • 2020-10-30
        • 2022-01-23
        • 2015-11-30
        相关资源
        最近更新 更多