本文目的:将多行转为一行,并将某列的内容作为多列标题。
SELECT DISTINCT TOP 50000 pom.billing_date,pom.production_no AS 工卡,pom.customer_name AS 客户,
pom.cloth_no AS 布编号,pom.cloth_name AS 布种,pom.cust_section_no AS 客户款号,
pom.color AS 颜色,pom.dye_no AS 色号,pom.zstrip AS 总条数,pom.zwkgs AS 总重量, dpp.procedure_name AS 工序--,dpp.myid
INTO #t
FROM dbo.pro_outstore_detail pod WITH(NOLOCK)
LEFT JOIN dbo.pro_outstore_master pom WITH(NOLOCK) ON pod.invno = pom.invno
LEFT JOIN dbo.dye_pro_master dpm WITH(NOLOCK) ON pom.production_no=dpm.production_no
LEFT JOIN dbo.dye_pro_process dpp WITH(NOLOCK) ON dpm.production_no = dpp.production_no
WHERE pom.billing_date>='2019-11-10' AND pom.billing_date<='2019-11-15' AND ISNULL(dpp.procedure_name,'')>''
--以上为结果集中间表
CREATE TABLE #m ( 工序 NVARCHAR(50) NULL )
INSERT INTO #m
SELECT DISTINCT 工序 FROM #t
--以上为需要转换的列的内容,作为一个中间表
DECLARE @sql_col NVARCHAR(MAX)= ' '
SET @sql_col = ' '
SELECT @sql_col+= 'ISNULL(MAX(CASE 工序 WHEN ''' + 工序
+ ''' THEN billing_date END ),'''') AS [' + 工序 + '],'
FROM #m
--以上为列内容转换为列标题的拼接语句
IF ( @sql_col != '' )
BEGIN
SET @sql_col = @sql_col + '$'
SET @sql_col = REPLACE(@sql_col, ',$', '')
END
--多了一个, 去掉
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'SELECT 工卡,客户,布编号,布种,客户款号,颜色,色号,总条数,总重量, ' + @sql_col
SET @sql += ' FROM #t GROUP BY 工卡,客户,布编号,布种,客户款号,颜色,色号,总条数,总重量 '
--以上为查询语句
EXEC(@sql)
PRINT ( @sql )
DROP TABLE #t
DROP TABLE #m
本文介绍了一种使用SQL进行数据透视的技巧,通过将多行数据转换为宽格式,以特定列的内容作为多列标题,实现了数据结构的灵活转换。此方法适用于需要将详细记录汇总并以表格形式展示的场景。
2327

被折叠的 条评论
为什么被折叠?



