[英]SQL Server Pivot without column names
I have this table:我有这张桌子:
SKU库存单位 | BrandId品牌标识 | Barcode条码 |
---|---|---|
1 1 | 1 1 | 123 123 |
1 1 | 1 1 | 987 987 |
1 1 | 1 1 | 852 852 |
1 1 | 2 2 | 951 951 |
1 1 | 2 2 | 753 753 |
2 2 | 1 1 | 926 926 |
2 2 | 1 1 | 364 364 |
2 2 | 2 2 | 854 854 |
2 2 | 2 2 | 256 256 |
2 2 | 2 2 | 351 351 |
2 2 | 2 2 | 157 157 |
2 2 | 3 3 | 976 976 |
I need this query result format:我需要这种查询结果格式:
SKU库存单位 | BrandId品牌标识 | Barcode1条码1 | Barcode2条码2 | Barcode3条码3 | Barcode4条码4 |
---|---|---|---|---|---|
1 1 | 1 1 | 123 123 | 987 987 | 852 852 | |
1 1 | 2 2 | 951 951 | 753 753 | ||
2 2 | 1 1 | 926 926 | 364 364 | ||
2 2 | 2 2 | 854 854 | 256 256 | 351 351 | 157 157 |
2 2 | 3 3 | 976 976 |
The barcode should be dynamic because there is unkown Barcodes for every SKU+BrandId row条形码应该是动态的,因为每个 SKU+BrandId 行都有未知的条形码
the concept is to build a dynamic pivot query as follow这个概念是建立一个动态 pivot 查询如下
CREATE TABLE #t (sku nvarchar(5), brandid nvarchar(5), barcode nvarchar(50) )
truncate table #t
INSERT INTO #t VALUES
(1,1,150),
(1,1,140),
(1,1,111),
(1,2,1234),
(1,2,145),
(2,1,345),
(2,1,532),
(2,2,875),
(2,2,1237),
(3,1,566)
select *,'Barcode'+CONVERT (nvarchar(50),ROW_NUMBER()over(partition by sku, brandid order by sku)) rn from #t
DECLARE @colName AS NVARCHAR(MAX), @pivotQ AS NVARCHAR(max)
SELECT @colName = ISNULL(@colName + ',', '') + QUOTENAME(rn)
FROM (select DISTINCT 'Barcode'+CONVERT (nvarchar(50),ROW_NUMBER()over(partition by sku, brandid order by sku)) rn from #t
) AS Labels ORDER BY rn
SET @pivotQ = N'
SELECT sku, brandid, '+@colName+'
FROM
(
SELECT sku, brandid , barcode , ''Barcode''+CONVERT (nvarchar(50),ROW_NUMBER()over(partition by sku, brandid order by sku)) rn
FROM #t
) AS SourceTable
PIVOT
(
MAX(barcode)
FOR rn IN ('+@colName+')
) AS PivotTable;
'
EXECUTE sp_executesql @pivotQ
I strongly suggest you do not go down the dynamic query route, as it can be difficult to code, and vulnerable to SQL injection.我强烈建议您不要将 go 向下动态查询路由,因为它可能难以编码,并且容易受到 SQL 注入的影响。
Instead just hard-code the maximum possible Barcode
columns in a normal conditional aggregation.相反,只需在正常的条件聚合中硬编码最大可能的Barcode
列。
SELECT
t.Sku,
t.BrandId,
Barcode1 = MAX(CASE WHEN t.rn = 1 THEN t.Barcode END),
Barcode2 = MAX(CASE WHEN t.rn = 2 THEN t.Barcode END),
Barcode3 = MAX(CASE WHEN t.rn = 3 THEN t.Barcode END),
Barcode4 = MAX(CASE WHEN t.rn = 4 THEN t.Barcode END),
Barcode5 = MAX(CASE WHEN t.rn = 5 THEN t.Barcode END),
Barcode6 = MAX(CASE WHEN t.rn = 6 THEN t.Barcode END),
Barcode7 = MAX(CASE WHEN t.rn = 7 THEN t.Barcode END),
Barcode8 = MAX(CASE WHEN t.rn = 8 THEN t.Barcode END),
Barcode9 = MAX(CASE WHEN t.rn = 9 THEN t.Barcode END),
Barcode10 = MAX(CASE WHEN t.rn = 10 THEN t.Barcode END)
FROM
(
SELECT *,
rn = ROW_NUMBER() OVER (PARTITION BY t.Sku, t.BrandId ORDER BY t.Barcode)
FROM YourTable t
) t
GROUP BY
t.Sku,
t.BrandId;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.