简体   繁体   English

SQL 服务器 Pivot 没有列名

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM