在SQL Server中进行透视查询

时间:2017-03-20 04:56:00

标签: sql-server pivot

我想基于以下

构建动态sql查询
SELECT P.Trackingno,PA.SKUId,SC.SKUName,count(PA.SKUId) as TotalSKUId 
        ,sum(case when PA.IsAvailable = 1 then 1 else 0 end) AS IsAvailable     
        FROM ADMIN.posavailability PA
        LEFT OUTER JOIN Admin.SKUCreation SC ON SC.TCID=PA.Skuid
        LEFT OUTER JOIN Admin.POSVisitDetails PD on PD.VisitId=PA.VisitID
        LEFT OUTER JOIN Admin.POS P ON P.TrackingNo=PD.TrackingNo       
        WHERE PA.VisitId in
        (SELECT visitid FROM Admin.POSVisitDetails PD  WHERE PD.month=2 and PD.year=2017) 
        and PA.IsActive=1
        GROUP BY P.Trackingno,PA.SKUId,SC.SKUName,PD.Month,PD.year
        ORDER BY P.Trackingno

我出去了如下:

enter image description here

我想要的输出是:

enter image description here

任何人都可以帮助动态透视SQL查询。

2 个答案:

答案 0 :(得分:2)

这里也许可以帮到你。 动态SQL查询

        CREATE TABLE TrackingTbl 
        (
            TrackingNo int,
            SKUID int,
            SKUName varchar(50),
            TotalSKUID int,
            IsAvaiable int
        )
        INSERT INTO TrackingTbl VALUES (1234,1,'Red',2,2)
        INSERT INTO TrackingTbl VALUES (1234,2,'White',2,1)
        INSERT INTO TrackingTbl VALUES (1234,3,'Blue',2,0)
        INSERT INTO TrackingTbl VALUES (1234,4,'Yellow',2,2)
        INSERT INTO TrackingTbl VALUES (3456,1,'Red',3,3)
        INSERT INTO TrackingTbl VALUES (3456,2,'White',3,2)
        INSERT INTO TrackingTbl VALUES (3456,3,'Blue',3,1)
        INSERT INTO TrackingTbl VALUES (3456,4,'Yellow',3,0)

        DECLARE @Columns varchar(200) 

        SET @Columns = Stuff((SELECT concat(', [',td.SKUName,']') FROM (select DISTINCT tt.SKUName  FROM TrackingTbl tt ) td FOR XML PATH (''))
                            ,1,1,'')

        DECLARE @Query nvarchar(max) = CONCAT(
        'SELECT TrackingNo,TotalSKUID,',@Columns,
        ' FROM 
        (
            SELECT tt.IsAvaiable, tt.SKUName ,tt.TrackingNo, tt.TotalSKUID
             FROM TrackingTbl tt
        ) sc
        PIVOT
        (
            sum(IsAvaiable) FOR SKuName IN (',@Columns,' )
        ) pvt')

        exec sp_executesql  @Query
        DROP TABLE dbo.TrackingTbl

答案 1 :(得分:0)

使用MAX ()

尝试此操作
 ;with cte as (
SELECT P.Trackingno,PA.SKUId,SC.SKUName,count(PA.SKUId) as TotalSKUId 
    ,sum(case when PA.IsAvailable = 1 then 1 else 0 end) AS IsAvailable     
    FROM ADMIN.posavailability PA
    LEFT OUTER JOIN Admin.SKUCreation SC ON SC.TCID=PA.Skuid
    LEFT OUTER JOIN Admin.POSVisitDetails PD on PD.VisitId=PA.VisitID
    LEFT OUTER JOIN Admin.POS P ON P.TrackingNo=PD.TrackingNo       
    WHERE PA.VisitId in
    (SELECT visitid FROM Admin.POSVisitDetails PD  WHERE PD.month=2 and PD.year=2017) 
    and PA.IsActive=1
    GROUP BY P.Trackingno,PA.SKUId,SC.SKUName,PD.Month,PD.year
    ORDER BY P.Trackingno
   )

 select trackingno,totalskuid,max(case when skuname='Red' then isavailable else '' end) Red,
                  max(case when skuname='White' then isavailable else '' end) White,
                  max(case when skuname='Blue' then isavailable else '' end) Blue,
                  max(case when skuname='Yellow' then isavailable else '' end) Yellow
from cte
group by trackingno,totalskuid