2012-10-16 5 views
-1

CASE 문에 대한 계산을 수행하는 데 필요한 T-SQL 쿼리가 있습니다. T-SQL CASE (SQL Server 2000)

은 내가 UNION을 추가하려고하는데 오류가 점점 오전 :

All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists.

어떤 아이디어? 감사.

쿼리 : ". UNION 연산자를 포함하는 SQL 문에 모든 쿼리가 대상 목록에있는 표현의 동일한 번호가 있어야합니다"

SELECT 
    CustomerID, Name, DueDate, 
    CASE WHEN DATEDIFF(Month, PaymentDate, DueDate) >= 1 
      THEN PaymentAmount ELSE 0 
    END AS [Early], 
    CASE WHEN DATEDIFF(Month, PaymentDate, DueDate) >=0 
      THEN PaymentAmount ELSE 0 
    END AS [On Time], 
    CASE WHEN DATEDIFF(Month, PaymentDate, DueDate) = -1 
      THEN PaymentAmount ELSE 0 
    END AS [Late] 
FROM 
    Customers 
WHERE 
    DATEDIFF(MONTH, PaymentDate,DueDate), GetDate()) = 1 
    AND PaymentAmount= DuesAmount 

UNION 

SELECT 
    '-Total', '', CustomerID, Name, DueDate, 
    SUM(CASE WHEN DATEDIFF(Month, PaymentDate, DueDate) >= 1 
       THEN PaymentAmount ELSE 0 END) AS [Early], 
    SUM(CASE WHEN DATEDIFF(Month, PaymentDate, DueDate) >= 0 
       THEN PaymentAmount ELSE 0 END) AS [On Time], 
    SUM(CASE WHEN DATEDIFF(Month, PaymentDate, DueDate) = -1 
       THEN PaymentAmount ELSE 0 END) AS [Late] 
FROM 
    Customers 
WHERE 
    DATEDIFF(MONTH, PaymentDate,DueDate), GetDate()) = 1 
    AND PaymentAmount = DuesAmount 
+0

@ruakh 귀하의 의견에 완전히 동의합니다. 우리는 단지 그것에 투표 할 수 있습니다 :) –

답변

3

오류는 말한다가, 즉, 각 SELECT은 같은 수의 식을 반환해야합니다. 당신이 우리에게 준 코드 샘플에서

, 첫 SELECT 문이 6 식을 반환, 두 번째는 반환 동안 8 :
SELECT CustomerID,    -- 1 
     Name,      -- 2 
     DueDate,     -- 3 
     CASE ... END AS [Early], -- 4 
     CASE ... END AS [On Time], -- 5 
     CASE ... END AS [Late]  -- 6 
... 
UNION 
SELECT '-Total',      -- 1 
     '',        -- 2 
     CustomerID,      -- 3 
     Name,       -- 4 
     DueDate,      -- 5 
     SUM(CASE ... END) AS [Early], -- 6 
     SUM(CASE ... END) AS [On Time], -- 7 
     SUM(CASE ... END) AS [Late]  -- 8 
... 

참조하는 방법을 처음 SELECT 수익률 6 개 표현하지만 두 번째 반환 (8)? UNION에서 모든 SELECT 문은 동일한 수의 식을 반환해야합니다.

두 번째 일치 항목이없는 열의 경우 첫 번째 쿼리에서 NULL을 반환 할 수 있습니다 (필요한 경우). 예 :

SELECT NULL as [RowType],   -- 1 
     NULL as [Padding],   -- 2 
     CustomerID,    -- 3 
     Name,      -- 4 
     DueDate,     -- 5 
     CASE ... END AS [Early], -- 6 
     CASE ... END AS [On Time], -- 7 
     CASE ... END AS [Late]  -- 8 
... 
UNION 
SELECT '-Total',      -- 1 
     '',        -- 2 
     CustomerID,      -- 3 
     Name,       -- 4 
     DueDate,      -- 5 
     SUM(CASE ... END) AS [Early], -- 6 
     SUM(CASE ... END) AS [On Time], -- 7 
     SUM(CASE ... END) AS [Late]  -- 8 
... 

또한 DueDate 열 뒤에 쉼표가 없음을 유의하십시오.

+0

폴 감사합니다 정보. 이제 오류없이 쿼리를 실행할 수 있습니다. 하지만 내 결과에 합계가 표시되지 않습니다. 어떤 아이디어? – steve

+0

아니요.하지만 합계가 끝에 오도록하려면 'ORDER BY ColumnName'이 필요할 수 있습니다. 그리고 고객이 합계를 원한다면'GROUP BY CustomerID'. 그리고 당신은'UNION ALL'을 시도해 볼 수 있습니다. 합계가 어떤 식 으로든 복제본으로 삭제되지는 않습니다. –

+0

다시 한번 감사드립니다. 결과의 중간에 표시되는 합계를 찾았습니다. 당신이 옳았어요, 나는 ORDER BY를 추가해야만했습니다. 나는 다른 사람이 나를 도왔다. 다음은 올바르게 작동하려면이 쿼리를 수정해야합니다. 다시 한 번 감사드립니다. 선택 * '' (선택 '' [의 ColumnName]로) 좋은 [CustomerID를] = '총' THEN 1 ELSE [CustomerID를] END – steve