SQL Server:仅当一列的计数大于另一列

时间:2015-12-03 22:25:05

标签: sql sql-server

我想做什么:

如果表OITMOITM.AssetSerNo)中序列号的出现总次数大于RDN1RDN1.SerialNum的同一序列号的出现次数({{1 }}),然后我想从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)

不幸的是,我收到错误是因为我的大部分商品既不属于集合,也不属于集合功能。我甚至不确定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,但随后将其发回并创建新的项目记录。

2 个答案:

答案 0 :(得分:0)

20种不同的方法,他们没事。以下是使用大多数代码并实现EXISTS()命令的方法。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="10dp" >

    <View android:id="@+id/mainActivity_view"
        android:layout_width="100dp"
        android:layout_height="100dp" />

    <TextView
        android:id="@+id/mainActivity_textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="15dp" />

</LinearLayout>

答案 1 :(得分:0)

这是使用一些子查询的选项

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