SQL 中的逆透视 - 视图首选

时间:2021-03-04 16:11:11

标签: sql-server tsql sql-view

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

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

我的出发点是:

<头>
PK 日期 AG 艺术 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 日期 AG 艺术 MA 文学士 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 ||巴|| BS || BZ不是空的。只有当所有 4 个都为空时,才能删除该行。

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

您好 埃里克

1 个答案:

答案 0 :(得分:5)

正如我在评论中提到的,CROSS APPLY VALUES 是处理这些类型的逆轴问题的最简单、效果最好的方法。

function sign_in() {
    let id = $('#login-id').val()
    let pw = $('#login-pw').val()

    if (id == '') {
        alert('Enter the ID')
        return;
    } else if (pw == '') {
        alert('Enter the PW ')
        return;
    }
    $.ajax({
        type: 'POST',
        url: '/sign_in',
        data: {
            id_give: id,
            pw_give: pw
        },
        success: function (response) {
            if (response['result'] == 'success') {
                $.cookie('mytoken', response['token'], **{path: '/'}**);
                window.location.replace("/")
            } else {
                alert(response['msg'])
            }
        }
    })

}
    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 ',   '  ')
    ;