【问题标题】:Pivot query for joining two tables and find SUM of a column用于连接两个表并查找列的 SUM 的枢轴查询
【发布时间】:2017-11-02 09:01:33
【问题描述】:

我有两个如下表:

Table: tb_student
StudentID   Mark    ConductedDate(datetime)

   1        50       02/23/2017 01:15:56 AM
   2        60       02/24/2017 01:15:56 AM
   3        70       02/23/2017 01:15:56 AM
   1        10       02/25/2017 01:15:56 AM
   2        50       02/23/2017 01:15:56 AM
   2        40       02/25/2017 01:15:56 AM


Table:tb_stvsclass
StudentID     ClassID
   1           A
   2           A 
   3           B 
   4           C 

Resulted Output should be:
 ClassID    StudentID    23/02/2017  24/02/2017 25/02/2017  SUM(MARK)
   A            1            50         0           10         60
   A            2            50        60           40         150
   B            3            70         0            0         70

我为此编写了静态查询。

    SELECT *
    FROM
   (
 select a.StudentID,a.Mark,a.ConductedDate, b.ClassID
 from tb_student a,tb_stvsclass b
 where a.StudentID=b.StudentID 
 ) x
 pivot
 (
 sum(Mark)
 for ConductedDate in ([02/23/2017 01:15:56 AM], [02/24/2017 01:15:56 AM], [02/25/2017 01:15:56 AM])
) p

但我需要动态 Pivot 查询。因为ConductedDate(datetime datatype) 可能会有所不同。那么如何转化为动态数据透视查询呢?

【问题讨论】:

    标签: sql-server tsql sql-server-2005 pivot


    【解决方案1】:

    您可以使用动态 SQL 来构建数据透视查询:

    create table #tb_student  (StudentID int,   Mark int,    ConductedDate datetime)
    create table #tb_stvsclass  (StudentID int,   ClassID nvarchar(10))
    declare @dates nvarchar(max) 
    declare @sum   nvarchar(max) 
    declare @query nvarchar(max) 
    
    --Initialize variables
    set @dates = ''
    set @sum   = ''
    set @query = ''
    
    --populate test tables
    insert into #tb_student select 1, 50, '20170223 01:15:56'
    insert into #tb_student select 2, 60, '20170224 01:15:56'
    insert into #tb_student select 3, 70, '20170223 01:15:56'
    insert into #tb_student select 1, 10, '20170225 01:15:56'
    insert into #tb_student select 2, 50, '20170223 01:15:56'
    insert into #tb_student select 2, 40, '20170225 01:15:56'
    
    insert into #tb_stvsclass select    1 ,'A'
    insert into #tb_stvsclass select    2 ,'A' 
    insert into #tb_stvsclass select    3 ,'B' 
    insert into #tb_stvsclass select    4 ,'C' 
    
    --generate date headers
    select @dates = @dates +'['+  CONVERT(VARCHAR, d.ConductedDate, 20)   + '],' 
    from (
        select  distinct ConductedDate from  #tb_student
    ) d
    
    --generate sum column for dynamic columns
    select @sum = @sum +'isnull(['+  CONVERT(VARCHAR, d.ConductedDate, 20)   + '],0)+' 
    from (
        select  distinct ConductedDate from  #tb_student
    ) d
    
    --remove last character
    set @dates = substring( @dates,1,LEN(@dates)-1)
    set @sum = substring( @sum,1,LEN(@sum)-1)
    
    --generate dynamic query using date headers and sum variables
    set @query = 
    ' SELECT *, '+ @sum + ' as [SUM(MARK)]' + 
    ' FROM'+
    ' ('+
    ' select a.StudentID,a.Mark,a.ConductedDate, b.ClassID'+
    ' from #tb_student a,#tb_stvsclass b'+
    ' where a.StudentID=b.StudentID '+
    ' ) x'+
    ' pivot'+
    ' ('+
    ' sum(Mark)'+
    ' for ConductedDate in ( '+
    @dates +
    ' )'+
    ' ) p'
    
    --execute dynamic query
    exec sp_executesql  @query
    
    --drop test tables
    drop table #tb_student  
    drop table #tb_stvsclass
    

    此命令的结果:

    添加几个日期:

    insert into #tb_student select 2, 90, '20170226 01:15:56'
    insert into #tb_student select 1, 10, '20170227 01:15:56'
    

    结果如下:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      相关资源
      最近更新 更多