如何解决动态 Pivot Sql Query 从一张表中显示所有内容
表-A:-
Custno | 姓名 | 路线 | 电话 |
---|---|---|---|
1 | C1 | 1 | 12345 |
2 | C2 | 1 | 23456 |
3 | C3 | 2 | 34567 |
4 | C4 | 1 | 45678 |
5 | C5 | 1 | 56789 |
表-B:-
日期 | Custno | 路线 | ProductId | 数量 |
---|---|---|---|---|
2021-04-22 | 1 | 1 | 1 | 100 |
2021-04-22 | 1 | 1 | 3 | 200 |
2021-04-22 | 2 | 1 | 1 | 120 |
表-C
ProductId | 品牌 |
---|---|
1 | 品牌 1 |
2 | 品牌 2 |
3 | 品牌 3 |
预期结果
电话 | CustNo | 姓名 | 品牌 1 | Brand-2 | Brand-3 |
---|---|---|---|---|---|
12345 | 1 | C1 | 100 | 200 | |
23456 | 2 | C2 | 120 | ||
45678 | 4 | C4 | |||
56789 | 5 | C5 |
我使用 Dynamic Pivot 尝试了什么
?:
解决方法
您可以重构查询
SELECT *
FROM
(
SELECT A.[Phone],A.[CustNo],A.[Name],C.[BrandName],B.[qty]
FROM [Table-A] AS A
LEFT JOIN [Table-B] AS B
ON A.[CustNo] = B.[CustNo]
AND B.[odate] = '2021-04-22'
LEFT JOIN [Table-C] AS C on C.productid = B.Productid
WHERE A.[Route] = 1
) t
PIVOT
(
MIN([qty]) FOR [BrandName] IN ([Brand-1],[Brand-2],[Brand-3])
) AS piv
其中包含 LEFT JOIN
而不是 INNER JOIN
和 STRING_AGG()
函数,以便动态生成透视列,如下面的代码块
DECLARE @cols AS NVARCHAR(MAX),@query AS NVARCHAR(MAX)
SET @cols = ( SELECT STRING_AGG(QUOTENAME([BrandName]),',')
FROM (SELECT DISTINCT [BrandName]
FROM [Table-C] ) C );
SET @query =
N'SELECT *
FROM
(
SELECT A.[Phone],B.[qty]
FROM [Table-A] AS A
LEFT JOIN [Table-B] AS B
ON A.[CustNo] = B.[CustNo]
AND B.[odate] = ''2021-04-22''
LEFT JOIN [Table-C] AS C on C.productid = B.Productid
WHERE A.[Route] = 1
) t
PIVOT
(
MIN([qty]) FOR [BrandName] IN (' + @cols + N')
) AS piv'
EXEC sp_executesql @query;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。