[英]SQL - for each id, count how many entries in one column is greater than another
[英]SQL Server: only return data if count of one column is greater than another
我想做的事:
如果表中的序列號出現的總次數OITM
( OITM.AssetSerNo
)比相同序列號的出現的總數越大RDN1
( RDN1.SerialNum
),那么我想從返回幾場OITM
使用資產編號OITM.ItemCode
(PKey)最大的匹配序列號進行記錄。
我的代碼如下
select
oitm.itemcode as 'Asset No',
oitm.itemname as 'Asset Description',
oitm.assetSerNo as 'Serial No'
from oitm
inner join rdn1 on oitm.assetserno = rdn1.serialnum
WHERE
OITM.itemtype = 'F'
and OITM.asststatus = 'A'
HAVING count(oitm.assetserno)>count(rdn1.serialnum)
不幸的是,我遇到了錯誤,因為我的大部分商品都不在group by中或不在匯總函數中。 我什至不確定HAVING
子句是解決該問題的最佳方法(實際上,我很確定不是)。
編輯:樣本數據(我猜是?)
OITM
ItemCode ItemName AssetSerNo ItemType AsstStatus 123 Object 1 QW F I 234 Object 2 ER F A 345 Object 3 RT F I 456 Object 4 TY F A 567 Object 1 QW F I 678 Object 5 YU F I 789 Object 3 RT F A 890 Object 1 QW F A 901 Object 2 UI F A
這是項目主清單數據記錄。 A =有效,I =無效。
RDN1
DocID Object Name Serial Num 1 Object 1 QW 2 Object 3 RT 3 Object 1 QW 4 Object 5 YU 5 Object 4 TY 6 Object 3 RT
這是退貨記錄的列表,用於租借物品何時返回倉庫。
預期產量:
ItemCode ItemName AssetSerNo 789 Object 3 RT 456 Object 4 TY
我需要創建退貨的所有項目的列表,但該項目尚未變為非活動狀態。 我不能僅僅在RDN1上進行內部聯接,因為我可能有返回的項目,項目記錄更改為I,然后又將其發送回並創建了新的項目記錄。
20種不同的方法可以做到這一點。 這是使用大多數代碼並實現EXISTS()命令的方法。
select
oitm.itemcode as 'Asset No',
oitm.itemname as 'Asset Description',
oitm.assetSerNo as 'Serial No'
from oitm x
WHERE
EXISTS(
select TOP 1 1
from oitm y
inner join rdn1 z on y.assetserno = z.serialnum
WHERE
y.itemtype = 'F'
and y.asststatus = 'A'
and y.assetSerNo = x.assetSerNo
HAVING count(y.assetserno)>count(z.serialnum)
)
這是使用一些子查詢的選項
SELECT
item.itemcode AS 'Asset No',
item.itemname AS 'Asset Description',
item.assetSerNo AS 'Serial No'
FROM
(
SELECT
oitm.itemcode,
oitm.itemname,
oitm.assetSerNo,
COUNT() OVER (PARTITION BY assetSerNo) assetSerNoCount,
ROW_NUMBER() OVER (PARTITION BY assetSerNo ORDER BY oitm.itemcode DESC) rn
FROM
oitm
WHERE
OITM.itemtype = 'F'
AND OITM.asststatus = 'A'
) item
LEFT JOIN (
SELECT
serialnum, COUNT(*) serialnumCount
FROM
rdn1
GROUP BY
serialnum
) serial ON serial.serialnum = item.assetSerNo
WHERE
ISNULL(serial.serialnumCount,0) < item.assetSerNoCount
AND item.rn = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.