我們有一個訂單表,每個訂單可以有多行。可以提交一式兩份、一式三份等訂單的場合很多。
我正在使用 Microsoft SQL Server Management Studio 來查詢表。我不是 T-SQL 方面的專家,我無法提出一個查詢來顯示重復/三次訂單數量的計數,其中BotReady = 'Y'.
這是我們的訂單存盤在表 ( dbo.OrderTable)中的方式的示例。該PurchaseOrderNumber所以因此我們用的是不是唯一的PurchaseOrderNumber,并AccountNumber作為一個超鍵。
| 機器人就緒 | 訂購單號碼 | 賬號 | 電話號碼 | 數量 | 單價 | 請求的UOM | 風格 | 顏色 | 產品類別 |
|---|---|---|---|---|---|---|---|---|---|
| 是 | 217344 | 0026985 | 1 | 30 | 5.40 | EA | 高鐵 | 11028 | H |
| 是 | 217344 | 0026985 | 2 | 10 | 7.99 | SQF | lr105 | 00114 | C |
| 是 | 217344 | 0026985 | 1 | 30 | 5.40 | EA | 高鐵 | 11028 | H |
| 是 | 217344 | 0026985 | 2 | 10 | 7.99 | SQF | lr105 | 00114 | C |
| N | 217344 | 0026985 | 1 | 30 | 5.40 | EA | 高鐵 | 11028 | H |
| N | 217344 | 0026985 | 2 | 10 | 7.99 | SQF | lr105 | 00114 | C |
| 是 | BD624919 | 0210995 | 1 | 158 | 12.80 | SHT | 551MR | 00122 | H |
| 是 | BD624919 | 0210995 | 1 | 158 | 12.80 | SHT | 551MR | 00122 | H |
| 是 | BD624919 | 0210995 | 1 | 158 | 12.80 | SHT | 551MR | 00122 | H |
| 是 | BD624920 | 0210995 | 1 | 12 | 3.80 | SQY | 211MX | 00132 | H |
| N | BD624920 | 0210995 | 2 | 12 | 0.99 | EA | HA258 | 01088 | H |
| 是 | 1269407 | 1911403 | 1 | 55 | 12.99 | 盒子 | HSMPR | 00150 | H |
| 是 | 1269407 | 1911403 | 2 | 2 | 200.00 | 滾動 | TGJ88 | 01088 | C |
| 是 | 1269407 | 1911403 | 3 | 1 | 10.00 | EA | 00000 | 00001 | 電阻 |
| 是 | 1269407 | 1911403 | 1 | 55 | 12.99 | 盒子 | HSMPR | 00150 | H |
| 是 | 1269407 | 1911403 | 2 | 2 | 200.00 | 滾動 | TGJ88 | 01088 | C |
| 是 | 1269407 | 1911403 | 3 | 1 | 10.00 | EA | 00000 | 00001 | 電阻 |
在SQL應該回傳4,因為有1個重復的訂單PurchaseOrderNumber = 217344,2人重復的BD624919,和1次重復的1269407。因此,由于每個訂單可以包含每個訂單的多行,這會影響重復的計算方式。
例如,由于 PurchaseOrderNumber 1269407 在訂單中有 3 行出現了兩次,它仍然只算作 1 個重復訂單(即使 3 行中有 2 行重復),因為它們都屬于同一訂單。
uj5u.com熱心網友回復:
COUNT并且MAX在子查詢中可以解決問題:
如果您只想將重復數顯示為4,則查詢將是:
select sum(tot) AS FINAL
from
(
select PurchaseOrderNumber, max(cnt) as tot
from
(
select
BotReady,
PurchaseOrderNumber,
AccountNumber,
Linenumber,
count(*)-1 as cnt
from t
where botready='Y'
group by
BotReady,
PurchaseOrderNumber,
AccountNumber,
Linenumber
having count(*)>1
) as q
group by PurchaseOrderNumber
) as h
如果你想要PurchaseOrderNumber有多少重復,查詢將是:
select PurchaseOrderNumber, max(cnt) as tot
from
(
select
BotReady,
PurchaseOrderNumber,
AccountNumber,
Linenumber,
count(*)-1 as cnt
from t
where botready='Y'
group by
BotReady,
PurchaseOrderNumber,
AccountNumber,
Linenumber
having count(*)>1
) as q
group by PurchaseOrderNumber
沒有太大的不同,只是SUM省略了 final 。
即使其中一些linenumbers不重復,上述查詢也會處理。在下面的小提琴鏈接中嘗試。
見DEMO中分貝<>小提琴
uj5u.com熱心網友回復:
如果我很好地理解您想檢測表中的重復項,即所有列上的相同資料,此查詢可以幫助您:
SELECT BotReady
,PurchaseOrderNumber
,AccountNumber
,LineNumber
,Quantity
,UnitPrice
,RequestedUOM
,Style
,Color
,ProductType
,COUNT(1)
FROM dbo.OrderTable
WHERE BotReady = 'Y'
GROUP BY BotReady
,PurchaseOrderNumber
,AccountNumber
,LineNumber
,Quantity
,UnitPrice
,RequestedUOM
,Style
,Color
,ProductType
HAVING COUNT(1) > 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/389557.html
標籤:sql sql-server
