'Rolling up' 一式三份的记录,嵌套的 case 语句(或循环)
'Rolling up' records in triplicate, nested case statement (or loops)
我有一个包含四列的 table:ID、OUTPUT、NOTE_TEXT、SOURCE
ID 值一式三份,因为我从三个不同的 SOURCE 中提取了日期,并使用了 all(联合不起作用,这很糟糕)。有效地将每条记录复制三次。
我需要将这些一式三份的 ID 值汇总到每个 ID 的一条记录中。
下面是 NOTE_TEXT 值的四种数据变体的屏幕截图,每个 ID 一式三份:
Table
下面是查询的示例输出:
Output
从 ID = 00793 可以明显看出,以下 case 语句无效。这是为什么?还有,是否可以修改它来工作,或者我应该构建一系列循环,还是有更优雅的解决方案?
最终目标是将其保存为存储过程并调用到 SSIS 项目中。感谢任何见解或建议。
select * from
(
select
ID
,OUTPUT
,case
when NOTE_TEXT = '' then case
when [SOURCE] = 'G1' and NOTE_TEXT != '' then NOTE_TEXT
when [SOURCE] = 'G2' and NOTE_TEXT != '' then NOTE_TEXT
when [SOURCE] = 'ENG' and NOTE_TEXT != '' then NOTE_TEXT
else ''
end
else NOTE_TEXT
end as NOTE_TEXT
from Table
) as temp
group by ID, OUTPUT, NOTE_TEXT
编辑:我可能不清楚,这是我想构建到查询中的逻辑,使用现有的 case 语句或任何其他方式。
- 如果所有三个 ID 记录在 NOTE_TEXT 列中都为 NULL,则对 NOTE_TEXT
使用一个(或第一个)具有 NULL 的 ID 记录
- 如果所有三个 ID 记录在 NOTE_TEXT 列中具有相同的文本,请使用一个(或第一个)ID 记录与 NOTE_TEXT
中的文本
- 如果在三个ID记录中,NOTE_TEXT列有一个文本值为NULL,则使用一个(或第一个)ID记录和NOTE_TEXT中的文本
- 如果在三个 ID 记录中,NOTE_TEXT 列有多个文本值,则使用第一个 ID 记录和 NOTE_TEXT 作为单个记录。
根据@Habo 的评论,使用 case 语句是行不通的。相反,这有效。
select distinct(ID) AS ID
,'' AS OUTPUT_TYPE
, (
select top 1
NOTE_TEXT
from [table] AS t
where NOTE_TEXT is not null
and NOTE_TEXT != ''
and t.SUPPLIER_ID = s.SUPPLIER_ID
) as NOTE_TEXT
from [table] as s
我有一个包含四列的 table:ID、OUTPUT、NOTE_TEXT、SOURCE
ID 值一式三份,因为我从三个不同的 SOURCE 中提取了日期,并使用了 all(联合不起作用,这很糟糕)。有效地将每条记录复制三次。
我需要将这些一式三份的 ID 值汇总到每个 ID 的一条记录中。
下面是 NOTE_TEXT 值的四种数据变体的屏幕截图,每个 ID 一式三份:
Table
下面是查询的示例输出:
Output
从 ID = 00793 可以明显看出,以下 case 语句无效。这是为什么?还有,是否可以修改它来工作,或者我应该构建一系列循环,还是有更优雅的解决方案?
最终目标是将其保存为存储过程并调用到 SSIS 项目中。感谢任何见解或建议。
select * from
(
select
ID
,OUTPUT
,case
when NOTE_TEXT = '' then case
when [SOURCE] = 'G1' and NOTE_TEXT != '' then NOTE_TEXT
when [SOURCE] = 'G2' and NOTE_TEXT != '' then NOTE_TEXT
when [SOURCE] = 'ENG' and NOTE_TEXT != '' then NOTE_TEXT
else ''
end
else NOTE_TEXT
end as NOTE_TEXT
from Table
) as temp
group by ID, OUTPUT, NOTE_TEXT
编辑:我可能不清楚,这是我想构建到查询中的逻辑,使用现有的 case 语句或任何其他方式。
- 如果所有三个 ID 记录在 NOTE_TEXT 列中都为 NULL,则对 NOTE_TEXT 使用一个(或第一个)具有 NULL 的 ID 记录
- 如果所有三个 ID 记录在 NOTE_TEXT 列中具有相同的文本,请使用一个(或第一个)ID 记录与 NOTE_TEXT 中的文本
- 如果在三个ID记录中,NOTE_TEXT列有一个文本值为NULL,则使用一个(或第一个)ID记录和NOTE_TEXT中的文本
- 如果在三个 ID 记录中,NOTE_TEXT 列有多个文本值,则使用第一个 ID 记录和 NOTE_TEXT 作为单个记录。
根据@Habo 的评论,使用 case 语句是行不通的。相反,这有效。
select distinct(ID) AS ID
,'' AS OUTPUT_TYPE
, (
select top 1
NOTE_TEXT
from [table] AS t
where NOTE_TEXT is not null
and NOTE_TEXT != ''
and t.SUPPLIER_ID = s.SUPPLIER_ID
) as NOTE_TEXT
from [table] as s