-1

CASEステートメントのカウントを合計する必要がある T-SQL クエリがあります。

UNION を追加しようとしましたが、エラーが発生しました:

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 
4

1 に答える 1

3

このエラーは、「演算子を含む SQL ステートメント内のすべてのクエリはUNION、ターゲット リストに同じ数の式を含める必要があります」と述べています。これが意味することは、それぞれSELECTが同じ数の式を返さなければならないということです。

提供されたコード サンプルでは、​​最初のSELECTステートメントは 6 つの式を返し、2 番目のステートメントは 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 個の式を返しますが、2 番目の式は 8 個を返します。ではUNION、すべてのSELECTステートメントが同じ数の式を返す必要があります。

NULL必要に応じて、2 番目のクエリで一致しない列を最初のクエリで返すことができます。例えば:

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 列の後にコンマがないことに注意してください。

于 2012-10-16T18:38:15.780 に答える