在 SQL 中反转 - 首选视图

Unpivot in SQL - view preferred

我需要一些关于 SQL 中逆透视数据的帮助。目前这在 SQL 服务器 SSIS 数据包上运行。将来这将不再可能。我希望,你能帮助我。

是否可以创建一个创建结果的视图?

我的出发点是:

PK Date AG ART MA1 MA2 MA3 BA1 BA2 BA3 BS1 BS2 BS3 BZ1 BZ2 BZ3
1 01.01.2021 1 A1 M1 M2 M3 100 105 110 10 15 20 50 60 70
2 01.01.2021 1 A2 M2 M3 100 113 11 12 18 8 9
3 02.01.2021 2 A3 M3 100 2 3 2 6
4 02.01.2021 5 A3 12 13 8 8
5 03.01.2021 3 A4 M2 M3 M1 100 102 103 3 4 5 7 8 9
6 03.01.2021 1 A5 M3 M1 100 105 7 3 5 8 8

试了几次让它看起来像这样,但我失败了:

我的目标是:

PK Date AG ART MA BA BS BZ
1 01.01.2021 1 A1 M1 100 10 50
1 01.01.2021 1 A1 M2 105 15 60
1 01.01.2021 1 A1 M3 110 20 70
2 01.01.2021 1 A2 M2 100 11 8
2 01.01.2021 1 A2 M3 113 12 9
2 01.01.2021 1 A2 18
3 02.01.2021 2 A3 M3 100 3 2
3 02.01.2021 2 A3 2
3 02.01.2021 2 A3 6
4 02.01.2021 5 A3 12
4 02.01.2021 5 A3 13
4 02.01.2021 5 A3 8 8
5 03.01.2021 3 A4 M2 100 3 7
5 03.01.2021 3 A4 M3 102 4 8
5 03.01.2021 3 A4 M1 103 5 9
6 03.01.2021 1 A5 M3 100 3 8
6 03.01.2021 1 A5 M1 105 5 8
6 03.01.2021 1 A5 7

MA "N",

BA "N",

BS“N”

BZ“N” 一起属于“N”

PK、Date、AG、Art不碰

每个MA、BA、BS和BZ都可以为空。必须显示行,如果 MA ||巴||学士 || BZ 不为空。只有4个都为空,才能删除该行。

谁能帮我解决这个问题? 有什么想法吗?

问候 埃里克

正如我在评论中提到的那样,交叉应用值是处理这些类型的逆轴问题的最简单、性能最好的方法。

    DROP TABLE IF EXISTS #Test;
    GO
    
    CREATE TABLE #Test
    (
        PK TINYINT IDENTITY PRIMARY KEY
        ,[Date] DATE NOT NULL
        ,AG TINYINT NOT NULL
        ,ART VARCHAR(2) NOT NULL
        ,MA1 VARCHAR(2) NOT NULL
        ,MA2 VARCHAR(2) NOT NULL
        ,MA3 VARCHAR(2) NOT NULL
        ,BA1 VARCHAR(3) NOT NULL
        ,BA2 VARCHAR(3) NOT NULL
        ,BA3 VARCHAR(3) NOT NULL
        ,BS1 VARCHAR(2) NOT NULL
        ,BS2 VARCHAR(2) NOT NULL
        ,BS3 VARCHAR(2) NOT NULL
        ,BZ1 VARCHAR(2) NOT NULL
        ,BZ2 VARCHAR(2) NOT NULL
        ,BZ3 VARCHAR(2) NOT NULL
    )
    ;
    GO

    INSERT INTO #Test
    (
        [Date]
        ,AG,ART
        ,MA1,MA2,MA3
        ,BA1,BA2,BA3
        ,BS1,BS2,BS3
        ,BZ1,BZ2,BZ3
    )
    VALUES
     ('01.01.2021',1,'A1',  'M1',   'M2',   'M3',   '100',  '105',  '110',  '10',   '15',   '20',   '50',   '60',   '70')
    ,('01.01.2021',1,'A2',  'M2',   'M3',   '  ',   '100',  '113',  '   ',  '11',   '12',   '18',   '8 ',   '9 ',   '  ') 
    ,('02.01.2021',2,'A3',  'M3',   '  ',   '  ',   '100',  '2  ',  '   ',  '3 ',   '  ',   '  ',   '2 ',   '  ',   '6 ')
    ,('02.01.2021',5,'A3',  '  ',   '  ',   '  ',   '12 ',  '13 ',  '   ',  '  ',   '  ',   '8 ',   '  ',   '  ',   '8 ')
    ,('03.01.2021',3,'A4',  'M2',   'M3',   'M1',   '100',  '102',  '103',  '3 ',   '4 ',   '5 ',   '7 ',   '8 ',   '9 ')
    ,('03.01.2021',1,'A5',  'M3',   'M1',   '  ',   '100',  '105',  '7  ',  '3 ',   '5 ',   '  ',   '8 ',   '8 ',   '  ')
    ;
    SELECT
        TST.PK
        ,TST.[Date]
        ,TST.AG
        ,TST.ART
        ,UNP.MA
        ,UNP.BA
        ,UNP.BS
        ,UNP.BZ
    FROM #Test AS TST
    CROSS APPLY
    (
        VALUES
        (MA1,BA1,BS1,BZ1,1)
        ,(MA2,BA2,BS2,BZ2,2)
        ,(MA3,BA3,BS3,BZ3,3)
    ) AS UNP (MA,BA,BS,BZ,ORD)
    ORDER BY
        TST.PK
        ,TST.[Date]
        ,TST.AG
        ,TST.ART
        ,UNP.ORD
    ;