SQL中的逆透视-首选视图
我需要一些有关 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 |
回答
正如我在评论中提到的,CROSS APPLY VALUES 是处理这些类型的逆向问题的最简单、性能最好的方法。
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
;