在 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
;
我需要一些关于 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
;