none
请问这个查询语句怎么写? RRS feed

  • 问题

  • 现在有一张表,三个字段,已经按照 全部字段 去重,需求是这样的:求每天每个menu的累积触达,累积触达就是说:在9月1日使用过menu1的所有用户,触达就是累积触达。9月2号的计算办法是,求出9月1号和9月2日的menu1所有用户,去重后就是9月2号的menu1的累积触达;以此类推,9月3日是1日+2日+3日去重。
    希望不要写动态sql,看不懂

    stbid   date   menu

    aaa     0901  1

    aaa     0901   2

    aaa     0902   1

    aaa     0902   3

    bbb     0901   1

    bbb     0901    3

    ccc     0902     2

    ccc     0903   2

    需要生成下面这张表:

    日期    0901    0902   0903

    menu1

    menu2

    menu3

    GO
    CREATE TABLE [dbo].[temp] (
    [STBID] varchar(30) NULL ,
    [date] date NULL ,
    [menu] varchar(10) NULL 
    )
    
    
    GO
    
    -- ----------------------------
    -- Records of temp
    -- ----------------------------
    INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'aaa', N'2017-09-01', N'1')
    GO
    GO
    INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'aaa', N'2017-09-01', N'2')
    GO
    GO
    INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'aaa', N'2017-09-02', N'1')
    GO
    GO
    INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'aaa', N'2017-09-02', N'3')
    GO
    GO
    INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'bbb', N'2017-09-01', N'1')
    GO
    GO
    INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'bbb', N'2017-09-02', N'4')
    GO
    GO
    INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'ccc', N'2017-09-02', N'2')
    GO
    GO
    INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'ccc', N'2017-09-03', N'2')
    GO
    GO


    • 已编辑 slbai 2017年9月22日 10:24
    2017年9月22日 10:22

全部回复

  • Hi slbai,

    所以,你是想要把字段值变成字段列名。是吧? 

    如果是的话,你可以用Pivot实现。请参考以下:

    CREATE TABLE [dbo].[temp] ( [STBID] varchar(30) NULL , [date] date NULL , [menu] varchar(10) NULL ) INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'aaa', N'2017-09-01', N'1') GO GO INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'aaa', N'2017-09-01', N'2') GO GO INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'aaa', N'2017-09-02', N'1') GO GO INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'aaa', N'2017-09-02', N'3') GO GO INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'bbb', N'2017-09-01', N'1') GO GO INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'bbb', N'2017-09-02', N'4') GO GO INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'ccc', N'2017-09-02', N'2') GO GO INSERT INTO [dbo].[temp] ([STBID], [date], [menu]) VALUES (N'ccc', N'2017-09-03', N'2') GO GO --select * from temp order by date,menu select STBID,[2017-09-01],[2017-09-02],[2017-09-03] from ( select STBID,date,'menu'+menu as menu,ROW_NUMBER()Over(Partition By date,STBID order by menu) as rn from temp ) t pivot ( max(menu) For date in ([2017-09-01],[2017-09-02],[2017-09-03]))pvt Order by STBID

    但是,由于你的date肯定是会增长的。所以,为了不需要讲字段名一个一个手动定义,还是需要用到动态SQL。请参考:

    DECLARE @cols AS NVARCHAR(MAX),
        @sql  AS NVARCHAR(MAX);
    
    SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(t.date) 
                FROM temp t
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    --print @cols
    
    set @sql = 'SELECT STBID, ' + @cols + ' from 
                (
                    select STBID,date,''menu''+menu as menu,ROW_NUMBER()Over(Partition By date,STBID order by menu) as rn
                    from temp
               ) x
                pivot 
                (
                     max(menu)
                    for date in (' + @cols + ')
                ) p '
    
    --print @sql
    execute(@sql)

    Thanks,
    Xi Jin.


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    • 已编辑 Xi Jin 2017年9月25日 6:50
    • 已建议为答案 Xi Jin 2017年9月26日 7:00
    2017年9月23日 7:48