我正在寻找一种方法来实际在MS SQL Server中的结果中创建一些重复。我知道通常你正在寻找不创建重复的方法,但在这个例子中我需要返回所有单独的行。
我正在使用一个包含大约1000万行和33列的表。该表由第一列中的ID组成,其余列具有“' Y'或者' NULL'在它们中 - 大多数列都是NULL。
在1000万行中,其中800万只只有一个“Y'每行剩余的200万行,其中有一列以及一个' Y'连续。
对于单个' Y'一个基本的case表达式可以很好地创建一列结果。
这是我的问题 - 我想要两行,每行一个' Y'如果有多个' Y'连续。
下面是一个小的去识别样本。
ID FLAG1 FLAG2 FLAG3 FLAG4 FLAG5
188 NULL NULL NULL NULL NULL
194 Y NULL NULL NULL NULL
200 Y NULL NULL NULL Y
我试图像这样使用Case Expression。
Select
ID
,Case
When [FLAG1] = 'Y'
Then 'FLAG1'
When [FLAG2] = 'Y'
Then 'FLAG2'
End as 'Service_Line'
我想要的是一个看起来像这样的结果。
ID Service_Line
194 FLAG1
200 FLAG1
200 FLAG5
我的问题是Case表达式只返回第一个结果,所以我最终得到了这个结果。
ID Service_Line
194 FLAG1
200 FLAG1
案例表达是否适合我想要完成的事情,或者我应该尝试以其他方式解决这个问题?
答案 0 :(得分:0)
case
不合适。一般的SQL方法是:
select id, 'FLAG1' as flag
from t
where flag1 = 'Y'
union all
select id, 'FLAG2' as flag
from t
where flag2 = 'Y'
union all
select id, 'FLAG3' as flag
from t
where flag3 = 'Y'
. . .
还有其他(更有效的)方法,但这些方法取决于您使用的数据库。
我应该注意:如果您希望将值放在一行中,case
是正确的方法:
select id,
concat( case when flag1 = 'Y' then 'FLAG1 ' else '' end,
case when flag2 = 'Y' then 'FLAG2 ' else '' end,
case when flag3 = 'Y' then 'FLAG3 ' else '' end,
. . .
) as flags
from t;
当然,concat()
的语法可能因数据库而异(concat()
本身是ANSI标准)。你也可以修剪掉最后一个空格。