2010-07-15 3 views
0

조건에 따라 특정 값을 반환해야하는 SQL Select 문이 있습니다. 매번 여러 값을 반환해야하지만 Case 문에 대한 이해는 각 사례에 대해 하나의 값만 반환 할 수 있다는 것입니다.SQL Server - 사례 문에 여러 값 설정?

저는이 상황에서 UNION 문을 사용하여이 문제를 해결하고 있습니다.하지만이 모든 것이 다소 번거롭기는합니다. 더 좋은 방법이 있습니까? 기본적으로 나는 각각 "Yes", "No"또는 "In Future"응답을 가지고있다. (실제로 응답이 더 많지만, 예를 들어 3을 사용하여 짧게 유지한다.) - 각 응답 유형에 대해 적절한 응답의 값으로 1을, 다른 모든 값에 0을 사용하여 열을 생성해야합니다. 그것은 당신이 SQL 보면

내 (간체) 쿼리는 다음과 같습니다 ... 이해하는 것이 아마 분명있다 :

SELECT branch, 
     prompttype, 
     CASE WHEN response = 'Y' THEN 'Yes' 
      WHEN response = 'N' THEN 'No' 
      WHEN response = 'D' THEN 'Not Discussed' 
    FROM prompts; 

는 다음과 같을 수 있습니다 ...

SELECT branch, 
     promptType, 
     response, 
     1 AS 'Yes', 
     0 AS 'No', 
     0 AS 'Not Discussed' 
FROM prompts 
WHERE response = 'Y' 

UNION 

SELECT branch, 
     promptType, 
     response, 
     0 AS 'Yes', 
     1 AS 'No', 
     0 AS 'Not Discussed' 
FROM prompts 
WHERE response = 'N' 

UNION 

SELECT branch, 
     promptType, 
     response, 
     0 AS 'Yes', 
     0 AS 'No', 
     1 AS 'Not Discussed' 
FROM prompts 
WHERE response = 'D' 

답변

3

응답에 대한 디코딩 테이블을 만든 다음 이에 합류 했습니까?

예를 들어,이 응답을 디코딩하기위한 테이블을 생성합니다 : (? 동일)

CREATE TABLE decoder (response CHAR(1), [Yes] BIT, [No] BIT, [Not Discussed] BIT) 
INSERT INTO decoder VALUES ('Y', 1, 0, 0) 
INSERT INTO decoder VALUES ('N', 0, 1, 0) 
INSERT INTO decoder VALUES ('D', 0, 0, 1) 

을 ... 그리고 당신은 유사한 얻기 위해 여기에 가입 할 수 결과 당신이 얻고로 UNION :

SELECT 
    prompts.branch, 
    prompts.prompttype, 
    prompts.response, 
    decoder.yes, 
    decoder.no, 
    decoder.[Not Discussed] 
FROM 
    prompts INNER JOIN decoder ON prompts.response = decoder.response 

고려할 가치가있는 접근 방법 일 수 있습니다. 그것은 당신의 노동 조합보다 더 많은 관계형 솔루션이며, 아마도 유지하기 쉽습니다.

+0

흥미 롭다, 나는 그것을 줄 것이다! 생각하지 못했습니다, 감사합니다 :-) – TabbyCool

+0

가장 좋은 대답으로 받아 들여진 결과 쿼리는 원래 가지고 있었던 것보다 훨씬 유지 보수가 용이합니다. – TabbyCool

4

뭔가처럼 무엇을 후입니다. 아마도 귀하의 코멘트 후

, ...

SELECT branch, 
     prompttype, 
     CASE WHEN response = 'Y' THEN 1 ELSE 0 AS Yes, 
     CASE WHEN response = 'N' THEN 1 ELSE 0 AS No, 
     CASE WHEN response = 'D' THEN 1 ELSE 0 AS Not_Discussed 
    FROM prompts; 

그것을 할 수 있습니다.

+0

즉, 프롬프트 값 ("Yes", "No", "Not Discussed")은 실제로 열 머리글이고 각 레코드는 각 필드에 0 또는 1을 갖습니다. 원래 게시물의 UNION 문에서 얻은 결과는 실제로 올바른 결과이며, 더 나은 생성 방법이있을 것이라고 생각했습니다. – TabbyCool

+0

아. 내가 참조. 나는 그것에 대해 조금 더 생각할 것이다. –

+0

감사합니다 :-) 기본적으로 Case 문 내에서 각 행에 대해 "Yes", "No"및 "Not Discussed"열의 값을 설정할 수 있어야합니다. 그러나 이것이 가능하지는 않습니다. . 대신 If 문을 사용하여 수행 할 수 있습니까? 그렇지 않다면, 연합은 단지해야 할 일이 있습니다, 그것은 단지 많은 중복과 같은 느낌입니다. – TabbyCool

0
SELECT branch, 
     prompttype, 
    response, 
     CASE WHEN response = 'Y' THEN 1 ELSE 0 END AS Yes, 
     CASE WHEN response = 'N' THEN 1 ELSE 0 END AS [No], 
     CASE WHEN response = 'D' THEN 1 ELSE 0 END AS Not_Discussed 
    FROM prompts; 
+0

이것은 Brian의 답변과 동일합니다. 필요한 출력을 생성하지 않습니다. – TabbyCool

0

이 당신의 CASE 문은 하나의 열에서 여러 값을 반환 제안하는 경우, 데이터 유형이 무엇 일 것입니다 : 등 배열,리스트, 테이블, XML 문서, 비즈니스 오브젝트를? 진정한 관계형 데이터베이스 관리 시스템 (TRDBMS)의 경우, 답은 관계 변수가됩니다. 그러나 여기에서는 SQL Server에 대해 설명합니다.

나는 SQL Server의 데이터 형식이 다중 값이 아닌 스칼라라는 것을 알고 있다고 생각합니다.

+0

단일 열에 여러 값을 사용하지 않으려는 경우 여러 열을 반환하지만 해당 값이 case 문에 설정되어 출력이 원래 쿼리에서 생성 된 것과 동일하게 유지됩니다. – TabbyCool

1

그룹화를 추가해야한다고 생각합니다. 나는 이것을 분기 별 계획으로했다. 각 응답에 대한 고유 ID가있는 경우,이 같은 (그렇지 않으면 전체 지점/prompttype/응답을 최대를 선택할 것) 될 것이다 :

난 그냥 함께 3 개 응답 매번 반환해야
SELECT uniqueID, 
    branch, 
    prompttype, 
    response, 
    MAX(CASE WHEN response = 'Y' THEN 1 ELSE 0 END) AS Yes, 
    MAX(CASE WHEN response = 'N' THEN 1 ELSE 0 END) AS [No], 
    MAX(CASE WHEN response = 'D' THEN 1 ELSE 0 END) AS Not_Discussed 
FROM prompts 

GROUP BY uniqueID, 
    branch, 
    prompttype, 
    response;