我正在寻找“取消旋转”表格,尽管我不确定最好的方法是什么。此外,这些值由“;”分隔。我列出了我正在查看的示例:
由此,我正在寻找一种方法来取消它,同时保持它当前所处的关系。如图所示,Column_B、C 和 D 中的第一个值被绑定(bind)在一起: |列_A|列_B|列_C|列_D| |:-|:-|:-|:-| |000|A|01|X| |000|B|02|Y| |000|C|03|D| |000|D|04|E| |001|A|05|S|
等等。
我最初的想法是使用 CTE,我将其设置为:
WITH TEST AS(
SELECT DISTINCT Column_A, Column_B, Column_C, VALUE AS Column_D
from [TABLE]
CROSS APPLY STRING_SPLIT(Column_D, ';'))
SELECT \* FROM TEST
;
尽管这似乎没有产生正确的结果,特别是在堆叠 CTE 和字符串分割之后。
作为更新,下面有一些非常有用的解决方案。它们都按预期运行,但我还添加了最后一项。如果行/列为空,是否可以/合理地忽略它?例如,跳过 Column_C,其中 Column_A 为“001”。 |列_A|列_B|列_C|列_D| |:-|:-|:-|:-| |000|A;B;C;D|01;02;03;04|X;Y;D;E| |001|A;B||S;T| |002|C|07|S|
最佳答案
这是一个基于 JSON 的方法。 SQL Server 2016 及以上版本。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ColA varchar(3), ColB varchar(8000), ColC varchar(8000), ColD varchar(8000));
INSERT INTO @tbl VALUES
('000','A;B;C;D','01;02;03;04','X;Y;D;E'),
('001','A;B','05;06','S;T'),
('002','C','07','S');
-- DDL and sample data population, end
WITH rs AS
(
SELECT *
, ar1 = '["' + REPLACE(ColB, ';', '","') + '"]'
, ar2 = '["' + REPLACE(ColC, ';', '","') + '"]'
, ar3 = '["' + REPLACE(ColD, ';', '","') + '"]'
FROM @tbl
)
SELECT ColA, ColB.[value] AS [ColB], ColC.[value] AS ColC, ColD.[value] AS ColD
FROM rs
CROSS APPLY OPENJSON (ar1, N'$') AS ColB
CROSS APPLY OPENJSON (ar2, N'$') AS ColC
CROSS APPLY OPENJSON (ar3, N'$') AS ColD
WHERE ColB.[key] = ColC.[key]
AND ColB.[key] = ColD.[key];
输出
+------+------+------+------+
| ColA | ColB | ColC | ColD |
+------+------+------+------+
| 000 | A | 01 | X |
| 000 | B | 02 | Y |
| 000 | C | 03 | D |
| 000 | D | 04 | E |
| 001 | A | 05 | S |
| 001 | B | 06 | T |
| 002 | C | 07 | S |
+------+------+------+------+
关于sql - “逆透视”SQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68472526/