2017-05-09 4 views
1

실제로 MS SQL Server에서 내 결과에 일부 복제본을 만드는 방법을 찾고 있습니다. 일반적으로 중복을 만들지 않는 방법을 찾고 있지만이 예제에서는 반환되는 모든 개별 행이 필요하다는 것을 알고 있습니다.여러 결과가 포함 된 사례 식

저는 약 1,000 만 개의 행과 33 개의 열이있는 테이블로 작업하고 있습니다. 테이블은 첫 번째 열의 ID로 구성되며 나머지 열에는 'Y'또는 'NULL'이 있습니다. 대다수의 열은 NULL입니다.

천만 행 중 8 백만 개가 행당 하나의 '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 

제 문제는 사례식이 첫 번째 결과 만 반환하므로이 문제가 끝납니다.

ID  Service_Line 
194 FLAG1 
200 FLAG1 

는 CASE 표현식 내가 달성하기 위해 노력하고 아니면 내가 다른 방법으로 이것에 대해 이동하는 것을 시도해야한다 무엇에 적합한가요?

+0

어떤 DB 시스템 (MySQL, PostgreSQL, Oracle, MS SQL Server 등)을 사용하고 있습니까? 이것은 우아한 방식으로 이런 문제를 해결하는 데 사용할 수있는 기능에 차이를 만들 수 있습니다. – IMSoP

+1

질문을 편집하고 사용중인 데이터베이스를 지정하십시오. –

+1

RDBMS가 UNPIVOT을 지원하는지 확인하십시오. –

답변

0

case은 적합하지 않습니다. 다른 (더 효율적으로) 방법이 있습니다

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' 
. . . 

, 그러나 그 사용중인 데이터베이스에 따라 달라집니다 : 일반적인 SQL 접근이 될 것이다.

내가주의해야한다 : 단일 행의 값하려는 경우 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

첫 번째 옵션이 작동하는 것으로 보입니다. 나는 업데이 트와 함께 동그라미 것입니다. –