当前位置: 代码迷 >> Sql Server >> sql怎么将纵向排列的数据?
  详细解决方案

sql怎么将纵向排列的数据?

热度:90   发布时间:2016-04-24 09:26:04.0
sql如何将纵向排列的数据???
 想要实现表1到表2的效果, 工序氧化有重复的行,请教!
表1:
单号 品名 工序号 工序名 生产量 报废量
MO1102 0002A 黑色 1 清洗 800 3
MO1102 0002A 黑色 2 喷砂 800 25
MO1102 0002A 黑色 3 氧化 800 1
MO1102 0002A 黑色 4 镭射 800 5
MO1102 0002A 黑色 5 氧化 800 0
MO1102 0002A 黑色 6 检查 800 10

表2:
单号        品名  清洗 喷砂 氧化 镭射 氧化 检查
MO1102    0002A 黑色  3 25 1 5 0 10

CREATE TABLE [mjob]
(
   [ID]                INT IDENTITY(1,1), 
   [P_Id]          VARCHAR(50),  --单号
    [P_Name]           VARCHAR(120),  --品名
    [Ps_Sn]            Int,       --工序号
    [Ps_name]           VARCHAR(120),  --工序名
    [Plan_Quan]        int,           --生产量
    [Scrap_Quan]        int,           --报废量
    CONSTRAINT [PK_mjob_ID] PRIMARY KEY(ID)
)

INSERT INTO mjob SELECT 'MO1102-0105', '0002A 黑色', 1,'清洗', 800, 3
INSERT INTO mjob SELECT 'MO1102-0105', '0002A 黑色', 2,'喷砂', 800, 25
INSERT INTO mjob SELECT 'MO1102-0105', '0002A 黑色', 3,'氧化', 800, 1
INSERT INTO mjob SELECT 'MO1102-0105', '0002A 黑色', 4,'镭射', 800, 5
INSERT INTO mjob SELECT 'MO1102-0105', '0002A 黑色', 5,'氧化', 800, 0
INSERT INTO mjob SELECT 'MO1102-0105', '0002A 黑色', 6,'检查', 800, 10
------解决思路----------------------
我原先第一反应就是这个,工序应该作为一行数据输出而不是做列头。
不过看你只给了一组数据,以为你每次只会查一组,所以给了动态的例子。
WITH /* 测试数据
mjob(P_Id,P_Name,Ps_Sn,Ps_name,Plan_Quan,Scrap_Quan) AS (
    SELECT 'MO1102 0002A','黑色',1,'清洗', 800, 3 UNION ALL
    SELECT 'MO1102 0002A','黑色',2,'喷砂', 800,25 UNION ALL
    SELECT 'MO1102 0002A','黑色',3,'氧化', 800, 1 UNION ALL
    SELECT 'MO1102 0002A','黑色',4,'镭射', 800, 5 UNION ALL
    SELECT 'MO1102 0002A','黑色',5,'氧化', 800, 0 UNION ALL
    SELECT 'MO1102 0002A','黑色',6,'检查', 800,10 UNION ALL
    SELECT 'MO1101 0001B','黑色',1,'开料',1000,30 UNION ALL
    SELECT 'MO1101 0001B','黑色',2,'拉丝',1000, 5 UNION ALL
    SELECT 'MO1101 0001B','黑色',3,'NC'  ,1000,10 UNION ALL
    SELECT 'MO1101 0001B','黑色',4,'氧化',1000,15 UNION ALL
    SELECT 'MO1101 0001B','黑色',5,'CNC' ,1000, 0 UNION ALL
    SELECT 'MO1101 0001B','黑色',6,'检查',1000, 7
),*/
t1 AS (
    SELECT *
      FROM (
            SELECT P_Id 单号,
                   P_Name 品名,
                   '工序名' tp,
                   Ps_Sn,
                   Ps_name
              FROM mjob
           ) t
     PIVOT (
            MAX(Ps_name)
            FOR [Ps_Sn] IN ([1],[2],[3],[4],[5],[6])
           ) p
)
,t2 AS (
    SELECT *
      FROM (
            SELECT P_Id 单号,
                   P_Name 品名,
                   '报废量' tp,
                   Ps_Sn,
                   Convert(varchar(11),Scrap_Quan) Scrap_Quan
              FROM mjob
           ) t
     PIVOT (
            MAX(Scrap_Quan)
            FOR [Ps_Sn] IN ([1],[2],[3],[4],[5],[6])
           ) p
)
SELECT *
  FROM (SELECT * FROM t1
        UNION ALL
        SELECT * FROM t2
       ) t
ORDER BY 单号, 品名, rn


单号         品名 tp     1           2           3           4           5           6
------------ ---- ------ ----------- ----------- ----------- ----------- ----------- -----------
MO1101 0001B 黑色 工序名 开料        拉丝        NC          氧化        CNC         检查
MO1101 0001B 黑色 报废量 30          5           10          15          0           7
MO1102 0002A 黑色 工序名 清洗        喷砂        氧化        镭射        氧化        检查
MO1102 0002A 黑色 报废量 3           25          1           5           0           10

  相关解决方案