簡體   English   中英

T-SQL中的子查詢分組

[英]Subquery grouping in T-SQL

我在嘗試獲取每個客戶的總逾期發票時遇到一個存儲過程問題,但這導致了意外的結果。

我要查詢的表如下所示:

| ClientId | IsNewInvoice | DueDate    |
+----------+--------------+------------+
| 220      | 1            | 2019/07/17 |
| 221      | 1            | 2019/07/15 |
| 222      | 1            |            |

查詢看起來像這樣

SELECT 
    ClientId,
    (SELECT COUNT(*)
     FROM Invoices
     WHERE DueDate IS NOT NULL 
       AND DueDate <> ''            
       AND CONVERT(DATETIME, CONVERT(VARCHAR, DueDate), 102) < 
        CAST((STR(YEAR(GETDATE())) + '/' +
              STR(MONTH(GETDATE())) + '/' +
              STR(DAY(GETDATE()))) AS DATETIME)) AS overdueInvoices,
    SUM(isNewInvoice) AS total
FROM 
    Invoices
GROUP BY
    clientId

但是以某種方式,在運行查詢后,我得到了以下結果,其中我的過期發票金額是每個客戶總計的兩倍:

| clientId | overdueInvoices | total |
+----------+-----------------+-------+
| 220      | 2               | 1     |
| 221      | 2               | 1     |
| 222      | 2               | 1     |

我猜我需要按客戶編號對過期發票進行分組,但是SQL抱怨

子查詢返回的值超過1。 當子查詢遵循=,!=,<,<=,>,> =或將子查詢用作表達式時,不允許這樣做

當我使用以下查詢時:

SELECT 
    ClientId,
    (SELECT COUNT(*)
     FROM Invoices
     WHERE DueDate IS NOT NULL 
       AND DueDate <> ''            
       AND CONVERT(DATETIME, CONVERT(VARCHAR, DueDate), 102) < 
           CAST((STR(YEAR(GETDATE())) + '/' +
                 STR(MONTH(GETDATE())) + '/' +
                 STR(DAY(GETDATE()))) AS DATETIME)  
     GROUP BY clientId) AS overdueInvoices,
    SUM(isNewInvoice) as total
FROM 
    Invoices
GROUP BY
    clientId

為什么要轉換為字符串以比較日期? 為什么要使用子查詢?

似乎您想要:

SELECT ClientId,
       SUM(CASE WHEN DueDate < CONVERT(DATE, GETDATE()) THEN 1 ELSE 0 END) as overdueInvoice,
       SUM(isNewInvoice) as total
FROM Invoices i
GROUP BY clientId;

假設DueDate已經是date / datetime (或類似datetime ),因為您在轉換時會這樣做。 如果是字符串,則應修復數據。 您還可以在查詢中將其轉換為日期值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM