当前位置: 代码迷 >> Sql Server >> SQL BOM分解表不一般数据实现
  详细解决方案

SQL BOM分解表不一般数据实现

热度:41   发布时间:2016-04-24 10:27:53.0
SQL BOM分解表特别数据实现
本帖最后由 asd620620 于 2014-06-20 16:37:20 编辑
有表如下
   代码          系列      代码  数量          
---------------- ----     ----   ----
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
*/
  相关解决方案