我想基于以下
构建动态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
我出去了如下:
我想要的输出是:
任何人都可以帮助动态透视SQL查询。
答案 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