Pivot in sql server

前端 未结 4 1335
南旧
南旧 2020-12-07 05:50

Yes I\'ve tried the code. My requirement is that user inputs Year and Month & prices are shown date-wise in columns for that year and month, with first column as Competi

4条回答
  •  轮回少年
    2020-12-07 06:14

    This is a lot easier. I wrote a stored proc named pivot_query that makes PIVOT a lot easier to use for SQL Server 2005+. The source for the proc is here, some examples how to use it are here.

    For your code example:

    create table Competitors
       (
       CompetitorId      integer identity,
       Name              varchar(30)
       )
    
    insert into Competitors values ('Bobs Discount Emporium')
    go
    insert into Competitors values ('Joes Really Cheap Crap')
    go
    
    create table CompetitorDetail
       (
       Id                integer identity,
       CompetitorId      integer,
       oDate             datetime,
       Price             decimal(12,3)
       )
    
    insert into CompetitorDetail values (1, getdate()-10, 10.00)
    go
    insert into CompetitorDetail values (1, getdate()-10, 10.00)
    go
    insert into CompetitorDetail values (1, getdate()-10, 10.00)
    go
    insert into CompetitorDetail values (1, getdate()-10, 10.00)
    go
    insert into CompetitorDetail values (1, getdate()-8, 11.00)
    go
    insert into CompetitorDetail values (1, getdate()-8, 11.00)
    go
    insert into CompetitorDetail values (1, getdate()-8, 11.00)
    go
    insert into CompetitorDetail values (1, getdate()-8, 11.00)
    go
    insert into CompetitorDetail values (1, getdate()-6, 12.00)
    go
    insert into CompetitorDetail values (1, getdate()-6, 12.00)
    go
    insert into CompetitorDetail values (1, getdate()-6, 12.00)
    go
    insert into CompetitorDetail values (1, getdate()-2, 13.00)
    go
    insert into CompetitorDetail values (1, getdate()-2, 13.00)
    go
    insert into CompetitorDetail values (1, getdate()-2, 13.00)
    go
    insert into CompetitorDetail values (2, getdate()-10, 14.00)
    go
    insert into CompetitorDetail values (2, getdate()-10, 14.00)
    go
    insert into CompetitorDetail values (2, getdate()-10, 14.00)
    go
    insert into CompetitorDetail values (2, getdate()-10, 14.00)
    go
    insert into CompetitorDetail values (2, getdate()-8, 15.00)
    go
    insert into CompetitorDetail values (2, getdate()-8, 15.00)
    go
    insert into CompetitorDetail values (2, getdate()-8, 15.00)
    go
    insert into CompetitorDetail values (2, getdate()-8, 15.00)
    go
    insert into CompetitorDetail values (2, getdate()-6, 16.00)
    go
    insert into CompetitorDetail values (2, getdate()-6, 16.00)
    go
    insert into CompetitorDetail values (2, getdate()-6, 16.00)
    go
    insert into CompetitorDetail values (2, getdate()-2, 18.00)
    go
    insert into CompetitorDetail values (2, getdate()-2, 18.00)
    go
    insert into CompetitorDetail values (2, getdate()-2, 18.00)
    go
    
    declare @mySQL varchar(MAX)
    
    set @mySQL = '
    select
       c.Name,
       right(cast(month(cd.oDate) + 100 as varchar(3)),2) + ''_'' + right(cast(day(cd.oDate) + 100  as varchar(3)),2) mon_day,
       cd.Price
    from
       Competitors c
    
       JOIN CompetitorDetail cd
          on (cd.CompetitorId = c.CompetitorId )
       ';
    
    exec pivot_query @mySQL, 'Name', 'Mon_Day', 'max(Price) MaxP,min(Price) MinP'
    

    which results in:

    Name                           01_09_MaxP   01_09_MinP   01_11_MaxP   01_11_MinP   01_13_MaxP   01_13_MinP   01_17_MaxP   01_17_MinP   
    ------------------------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ 
    Bobs Discount Emporium         10.000       10.000       11.000       11.000       12.000       12.000       13.000       13.000       
    Joes Really Cheap Crap         14.000       14.000       15.000       15.000       16.000       16.000       18.000       18.000       
    

    Hope that helps!

提交回复
热议问题