有表如下
代码 系列 代码 数量
---------------- ---- ---- ----
M.QZ.AM.TL.00001 内牙 2010 1
B.QZ.AM.TL.00024 内牙 2010 1
B.QT.AM.TL.00022 内牙 2010 1
P.BJ.PL.00008 平螺母 2010 1
P.CY.QW.00001 球碗 2010 1
P.CY.QW.00002 球碗 2010 1
P.CY.SG.00054 内牙 2011 2
实验数据:
SELECT 'M.QZ.AM.TL.00001',N'内牙','2010','1' UNION ALL
SELECT 'B.QZ.AM.TL.00024',N'内牙','2010','1' UNION ALL
SELECT 'B.QT.AM.TL.00022',N'内牙','2010','1' UNION ALL
SELECT 'P.BJ.PL.00008',N'平螺母','2010','1' UNION ALL
SELECT 'P.CY.QW.00001',N'球碗','2010','1' UNION ALL
SELECT 'P.CY.QW.00002',N'球碗','2010','1' UNION ALL
SELECT 'P.CY.SG.00054',N'内牙','2011','2'
希望通过查询行转列效果如下
内牙 数量 球碗 数量 平螺母 数量 FItemID
---------------- ---- --------- ------- ---------------- ---- -------
B.QZ.AM.TL.00024 1 P.CY.QW.00002 1 P.BJ.PL.00008 1 2010
B.QT.AM.TL.00022 1 P.CY.QW.00001 1 NULL 2010
M.QZ.AM.TL.00001 1 NULL NULL 2010
P.CY.SG.00054 2 NULL NULL 2011
可以通过哪种方式达到这样的效果。不胜感激~
------解决方案--------------------
下班了,着急回家,一个不靠谱的做法。
IF OBJECT_ID('tempdb..#Test','U') IS NOT NULL DROP TAbLE #Test
CREATE TABLE #Test
(
Code VARCHAR(200)
,NAME NVARCHAR(20)
,Dates INT
,Counts INT
)
INSERT INTO #Test
SELECT 'M.QZ.AM.TL.00001',N'内牙','2010','1' UNION ALL
SELECT 'B.QZ.AM.TL.00024',N'内牙','2010','1' UNION ALL
SELECT 'B.QT.AM.TL.00022',N'内牙','2010','1' UNION ALL
SELECT 'P.BJ.PL.00008',N'平螺母','2010','1' UNION ALL
SELECT 'P.CY.QW.00001',N'球碗','2010','1' UNION ALL
SELECT 'P.CY.QW.00002',N'球碗','2010','1' UNION ALL
SELECT 'P.CY.SG.00054',N'内牙','2011','2'
;WITH test1 AS
(
SELECT ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY GETDATE()) AS ID
,*
FROM #Test
)
--SELECT * FROM test1
SELECT LEFT([内牙],CHARINDEX('-',[内牙])-1) AS [内牙]
,CAST(REVERSE(LEFT(REVERSE([内牙]),CHARINDEX('-',REVERSE([内牙]))-1)) AS INT) AS [数量]
, LEFT([球碗],CHARINDEX('-',[球碗])-1) AS [球碗]
,CAST(REVERSE(LEFT(REVERSE([球碗]),CHARINDEX('-',REVERSE([球碗]))-1)) AS INT) AS [数量]
, LEFT([平螺母],CHARINDEX('-',[平螺母])-1) AS [平螺母]
,CAST(REVERSE(LEFT(REVERSE([平螺母]),CHARINDEX('-',REVERSE([平螺母]))-1)) AS INT) AS [数量]
,Dates
FROM (SELECT ID,Code+'-'+CAST(counts AS VARCHAR) AS Code,NAME,Dates FROM test1) AS A
PIVOT (MAX(Code) FOR NAME IN([内牙],[球碗],[平螺母]))p
/*
内牙 数量 球碗 数量 平螺母 数量 Dates
M.QZ.AM.TL.00001 1 P.CY.QW.00001 1 P.BJ.PL.00008 1 2010
B.QZ.AM.TL.00024 1 P.CY.QW.00002 1 NULL NULL 2010
B.QT.AM.TL.00022 1 NULL NULL NULL NULL 2010
P.CY.SG.00054 2 NULL NULL NULL NULL 2011
*/