“滚动”记录一式三份,嵌套的case语句(或循环)

时间:2018-01-22 19:58:37

标签: sql tsql ssms-2012

我有一个包含四列的表:ID,OUTPUT,NOTE_TEXT,SOURCE

ID值一式三份,因为我用一个union all从三个不同的SOURCE中提取日期(一个联合不起作用,这很糟糕)。有效地使每条记录重复三次。

我需要将这些一式三份的ID值分解为每个ID一个记录。

以下是每个ID三次重复的NOTE_TEXT值的四种数据变体的屏幕截图:

Table

以下是来自以下查询的示例输出:

Output

从ID = 00793可以看出,以下案例陈述不起作用。这是为什么?同样,它可以修改为可以工作,还是应该构建一系列循环,还是有更优雅的解决方案?

最终目标是将其保存为存储过程并调用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语句或任何其他方式构建到查​​询中的逻辑。

  • 如果NOTE_TEXT列中的所有三个ID记录都为NULL,则对NOTE_TEXT使用一个(或第一个)ID记录为NULL
  • 如果所有三个ID记录在NOTE_TEXT列中具有相同的文本,请使用一个(或第一个)ID记录和NOTE_TEXT中的文本
  • 如果在三个ID记录中,NOTE_TEXT列有一个文本值,其余为NULL,请使用一个(或第一个)ID记录和NOTE_TEXT中的文本
  • 如果在三个ID记录中,NOTE_TEXT列有多个文本值,请使用第一个ID记录和NOTE_TEXT作为单个记录。

1 个答案:

答案 0 :(得分:0)

根据@ Habo的评论,使用案例陈述并不起作用。相反,这很有效。

class MyClass {
    func mainMethod() {} }

extension MyClass {
    func extensionMethod() {} }