gpt4 book ai didi

SQL Unpivot/Coalesce 多列基于值的一列

转载 作者:行者123 更新时间:2023-12-02 00:42:44 25 4
gpt4 key购买 nike

我正在尝试根据目标列中的值将多个列反透视/合并为一个值。

给定以下示例数据:

CREATE TABLE SourceData (
Id INT
,Column1Text VARCHAR(10)
,Column1Value INT
,Column2Text VARCHAR(10)
,Column2Value INT
,Column3Text VARCHAR(10)
,Column3Value INT
)

INSERT INTO SourceData
SELECT 1, NULL, NULL, NULL, NULL, NULL, NULL UNION
SELECT 2, 'Text', 1, NULL, NULL, NULL, NULL UNION
SELECT 3, 'Text', 2, 'Text 2', 1, NULL, NULL UNION
SELECT 4, NULL, NULL, NULL, 1, NULL, NULL

我正在尝试生成以下结果集:

Id          ColumnText
----------- ----------
1 NULL
2 Text
3 Text 2
4 NULL

其中 ColumnXText 列值根据以下条件成为每行一个“ColumnText”值:

  1. 如果所有 ColumnX 列都是 NULL,则 ColumnText = NULL
  2. 如果 ColumnXValue 值为“1”且 ColumnXText 为 NULL,则ColumnText = NULL
  3. 如果 ColumnXValue 值为“1”且 ColumnXText 不为空,则ColumnText = ColumnXText。

没有超过一个 ColumnXValue 为“1”的记录。

我在这个 SQL Fiddle @ http://sqlfiddle.com/#!6/f2e18/2 中尝试过

我试过了(在 SQL fiddle 中显示):使用 CROSS/OUTER APPLY 取消旋转。我放弃了这种方法,因为我无法获得产生预期结果的 WHERE 条件。

我也尝试过使用 UNPIVOT,但没有成功。

我在想一个似乎不正确的蛮力方法。真正的源表有 44MM 行。我不控制源表的模式。

如果有比 CASE WHEN 的蛮力纠结更简单的方法,请告诉我。谢谢。

最佳答案

我不认为尝试在这方面太聪明有多大意义

SELECT 
Id,
CASE
WHEN COLUMN1VALUE = 1 THEN COLUMN1TEXT
WHEN COLUMN2VALUE = 1 THEN COLUMN2TEXT
WHEN COLUMN3VALUE = 1 THEN COLUMN3TEXT
End as ColumnText
From
Sourcedata

我确实按 321 顺序排列它们,但考虑到如果以 123 顺序进行检查,可能会更快找到正确答案(更少的检查,如果有 4400 万行,可能很重要)

关于SQL Unpivot/Coalesce 多列基于值的一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45619670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com