簡體   English   中英

SQL Server:僅當一列的計數大於另一列的計數時才返回數據

[英]SQL Server: only return data if count of one column is greater than another

我想做的事:

如果表中的序列號出現的總次數OITMOITM.AssetSerNo )比相同序列號的出現的總數越大RDN1RDN1.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.

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