-1

我有一个 T-SQL 查询,我需要计算CASE语句的计数。

我试图添加一个 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

错误说:“包含UNION运算符的 SQL 语句中的所有查询必须在其目标列表中具有相同数量的表达式。” 这意味着每个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?在 aUNION中,所有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 列之后没有逗号。

于 2012-10-16T18:38:15.780 回答