2017-05-09 99 views
1

我正在寻找一种方法在MS SQL Server中实际创建一些重复结果。我明白,通常你正在寻找不创建重复的方法,但在这个例子中,我需要返回所有单独的行。具有多个结果的表达式表达式

我正在使用一个约1000万行和33列的表格。该表由第一列中的ID组成,其余列中有'Y'或'NULL' - 大部分列为NULL。

在1000万行中,有800万行每行只有一个'Y',剩下的2百万行有多个行,并且'Y'连续。

对于具有单个“Y”的行,基本情况表达式完美地适用于创建单列结果。

这是我的问题,虽然 - 我想要两行,每个'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 

我正在尝试使用这样的案例表达式。

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

你正在使用哪种数据库系统(MySQL,PostgreSQL,Oracle,MS SQL Server等)?这可能会有助于您以优雅的方式解决此类问题。 – IMSoP

+1

编辑您的问题并指定您正在使用的数据库。 –

+1

检查您的RDBMS是否支持UNPIVOT。 –

回答

0

A 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标准)。你也可以修剪掉最后一个空间。

+0

谢谢你的回复,但这会导致两个项目在一个单元中。我正在为每个项目寻找一行,而不是将它们连接成一个单元格。 –

+0

您的第一个选项似乎在工作。我会回圈更新。 –