我一直在尋找這個問題的答案,但我沒有找到完全適合我的問題的方法。我的基礎資料來自 Microsoft Dynamics AX(以下已更改,但反映了我正在使用的內容)。
以下查詢(SQL Server 2008,使用 SSMS)將回傳一個表,其中“ITEMID”列中有重復項,但 ITEMID/SECTIONID 組合是唯一的。ITEMID 可以有多個 SECTIONID,我想找到“ITEMID”的計數。
當我添加它時,它會回傳所有專案的計數“1”,而不是預期的“2”或更多。
鏈接到 SQLFiddle
我使用 SQL 的時間不長,所以如果它很明顯,請原諒我。:)
我的完整查詢:
WITH cteSections AS (
SELECT
i.ITEMID,
r.SECTIONID,
RN = ROW_NUMBER()OVER(PARTITION BY i.ITEMID, r.SECTIONID ORDER BY i.ITEMID)
FROM InventTable i
LEFT JOIN RetailInventItemSectionLocation r ON i.ITEMID = r.ITEMID
LEFT JOIN InventSum s ON i.ITEMID = s.ITEMID
WHERE s.AVAILPHYSICAL <> 0 AND r.STOREID = '00001'
)
SELECT
cteSections.ITEMID,
cteSections.SECTIONID,
COUNT(*) AS COUNT
FROM cteSections
WHERE cteSections.RN = 1
GROUP BY cteSections.ITEMID,
cteSections.SECTIONID
ORDER BY cteSections.ITEMID
預期輸出:
| 專案ID | SECTIONID | 數數 |
|---|---|---|
| 00006W | KLT27 | 1 |
| 00100 | KLT16 | 1 |
| 006101 | GCY12 | 2 |
| 006101 | GCY11 | 2 |
| 00613 | KLT16 | 1 |
| 00635 | KLT16 | 1 |
| 006815 | KLT28 | 1 |
| 006859 | GCY14 | 3 |
| 006859 | GCY15 | 3 |
| 006859 | GCY11 | 3 |
但無論我做什么,我得到的都是“COUNT”列中的所有 1。我究竟做錯了什么?
uj5u.com熱心網友回復:
您的主要問題是,一旦您將一列添加到 中GROUP BY,您就會為它的每個組合獲得另一行。
同樣由于某種原因,您已經在使用 過濾重復項ROW_NUMBER,即使分組無論如何都會減少這些行。
無論哪種方式,您似乎只想要一個視窗COUNT
SELECT
ITEMID,
SECTIONID,
COUNT(*) AS CountPerSectionAndItemId,
COUNT(*) OVER (PARTITION BY SECTIONID) AS CountOfItemIds
FROM mySampleData s
GROUP BY
ITEMID,
SECTIONID
ORDER BY
SECTIONID;
SQL小提琴
請注意,此計數發生在分組之后。如果你想要計數的總和,那么你需要SUM(COUNT(*)) OVER (PARTITION BY SECTIONID)
uj5u.com熱心網友回復:
在與@patrick tucci 進行初步討論后,我可能已經回答了我自己的問題。獲得我想要的結果的唯一方法是基本上“破解”查詢,如下所示。如果有更好的方法,請分享:
WITH cteSections AS (
SELECT
i.ITEMID,
i.NAMEALIAS,
r.STOREID,
r.SECTIONID,
RN = ROW_NUMBER()OVER(PARTITION BY i.ITEMID, r.SECTIONID ORDER BY i.ITEMID)
FROM InventTable i
LEFT JOIN RetailInventItemSectionLocation r ON i.ITEMID = r.ITEMID
LEFT JOIN InventSum s ON i.ITEMID = s.ITEMID
WHERE s.AVAILPHYSICAL <> 0 AND r.STOREID = '00001'
)
SELECT
cteSections.ITEMID,
MAX(cteSections.NAMEALIAS) AS NAMEALIAS,
MAX(cteSections.SECTIONID) AS SECTIONID,
COUNT(cteSections.ITEMID) AS COUNT
FROM cteSections
WHERE cteSections.RN = 1
GROUP BY cteSections.ITEMID
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/504673.html
