[英]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.