sql >> データベース >  >> RDS >> Sqlserver

列の動的リストを含むSQLピボットデータ

    これが私がそれをする方法です:

    /*
    create table ##order  ( ID int, ProdID int, Quantity int, [Date] date, CustID int, StoreID int );
    insert into ##order values (1,1,5,'2011-01-10' ,12,1), (2,2,10,'2011-03-10',4 ,1), (3,3,8,'2011-03-10' ,5 ,1), (4,4,11,'2011-05-10',4 ,2), (5,5,5,'2011-05-10' ,14,2), (6,6,8,'2011-06-10' ,3 ,3);
    create table ##product (ProdID int, ProdName varchar(64), ProdDesc varchar(255), ProdType int);
    insert into ##product values (1,'Bananas','Chiquita',1), (2,'Apples','Green Apples',1), (3,'Grapes','Green Grapes',1), (4,'Potatoes','Idaho potatoes',2), (5,'Brocolli','Green Brocolli',2), (6,'Plates','Paper Plates',3);
    create table ##ProdType (TypeID int, Name varchar(64), [Desc] varchar(255));
    insert into ##ProdType values (1,'Fruits','Fresh Fruits'),(2,'Vegetables','Fresh Veggies'),(3,'Kitchen','Kitchen stuff');
    create table ##loc (loc_id int, city varchar(50), [state] varchar(50))
    insert into ##loc values(1, 'Atlanta','GA'), (2, 'New york', 'NY'), (3, 'Chicago', 'IL');
    */
    
    declare @cmd varchar(max), @columns varchar(max)
    set @columns = ''
    
    
    select @columns = @columns + '['+Name+'],' from ##ProdType order by name asc
    select @columns = substring(@columns, 0, len(@columns))
    
    set @cmd = '
    select city, date,'[email protected]+' from
    (
    select   
       ct.city,
       ord.Date,
       pt.Name,
       ord.Quantity
    from 
       ##order ord 
       join ##product pr on ord.ProdID = pr.ProdID
       join ##ProdType pt on pr.ProdType = pt.TypeID
       join ##loc ct on ord.StoreID = ct.loc_id
    )date_to_pivot
    PIVOT
    (
    SUM(Quantity) for Name in ('[email protected]+')
    )PIVOTED_DATA'   
    
    exec (@cmd)
    

    caseステートメントを使用した拡張機能は次のとおりです。

    set @columns = ''
    
    select @columns = ''
    select @columns = @columns + 'sum(case when pt.Name = '''+Name+''' then ord.Quantity else 0 end) as '+Name+'_SUM,' from ##ProdType order by name asc
    select @columns = @columns + 'count(case when pt.Name = '''+Name+''' then ord.Quantity else 0 end) as '+Name+'_COUNT,' from ##ProdType order by name asc
    select @columns = substring(@columns, 0, len(@columns))
    
    
    set @cmd = '
    select   
       ct.city,
       ord.Date,   '
       [email protected]+
    '   
    from 
       ##order ord 
       join ##product pr on ord.ProdID = pr.ProdID
       join ##ProdType pt on pr.ProdType = pt.TypeID
       join ##loc ct on ord.StoreID = ct.loc_id
    group by
       ct.city,
       ord.Date'
    
       exec (@cmd)
    



    1. Hibernateで<map> をフェッチする方法

    2. EXCEPT演算子とNOTIN演算子の違いを理解する

    3. 複数のテーブルでのMySQL結合とCOUNT()

    4. SQLサブクエリの結果で「LIKE」を使用する