sql - “逆透视”SQL 表

标签 sql sql-server t-sql

我正在寻找“取消旋转”表格,尽管我不确定最好的方法是什么。此外,这些值由“;”分隔。我列出了我正在查看的示例:

<表类=“s-表”> <标题> Column_A Column_B Column_C Column_D <正文> 000 A;B;C;D 01;02;03;04 X;Y;D;E 001 A;B 05;06 S;T 002 C 07 S

​ 由此,我正在寻找一种方法来取消它,同时保持它当前所处的关系。如图所示,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/

相关文章:

java - 如何在 Hive 嵌入式模式下运行包含 "select count(*)"和 "group by"子句的 Hive Sql 查询?

SQL Server 存储过程将选择结果导出到 CSV

python - "Insert Into"语句由于"Parameter 7 ("而导致错误"): The supplied value is not a valid instance of data type float."

sql - 从 SUM(column) <= @variable 的表中选择前 X

mysql - 如何解决这两个查询?

mysql - 加入 SQL 查询 - 无法借助 IP 编写获取国家/地区的查询

sql - 在 Linq 中加入子查询结果

sql-server - 将参数传递给声明变量 T-SQL

sql - 将行从一个表复制到另一个表,忽略重复项

sql - T-SQL/SSIS - 使用主/外键重新设计后表锁定