Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-从单独表中的列值中选择记录计数_Sql_Sql Server_Database_Tsql - Fatal编程技术网

SQL-从单独表中的列值中选择记录计数

SQL-从单独表中的列值中选择记录计数,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,我在这里完全被难住了,我希望我没有忽略其他地方的答案 我有两张桌子,资产和采购订单 资产 采购订单 我正在尝试获取采购订单列表,每个订单都符合以下标准: 具有给定采购订单键的资产表中的行总数小于具有该采购订单键的采购订单行中的资产值的行数。 例如,假设资产表有4行具有相同的采购订单键24,17项具有不同的采购订单键66。如果purchase\u order 24列出了4个资产编号,purchase\u order 66列出了19个资产编号,则查询应返回purchase\u order 66,但不

我在这里完全被难住了,我希望我没有忽略其他地方的答案

我有两张桌子,资产和采购订单

资产

采购订单

我正在尝试获取采购订单列表,每个订单都符合以下标准:

具有给定采购订单键的资产表中的行总数小于具有该采购订单键的采购订单行中的资产值的行数。
例如,假设资产表有4行具有相同的采购订单键24,17项具有不同的采购订单键66。如果purchase\u order 24列出了4个资产编号,purchase\u order 66列出了19个资产编号,则查询应返回purchase\u order 66,但不返回purchase\u order 24。

您可以使用子查询:

SELECT *
FROM purchase_order
WHERE number_of_assets > (
    SELECT COUNT(*)
    FROM asset
    WHERE asset.purchase_order_key = purchase_order.purchase_order_key
)
您需要对加入PO表的资产进行计数,然后将其与记录的资产数量进行比较

SELECT PO.purchase_order_key, COUNT(A.purchase_order_key)
FROM purchase_order PO
    LEFT JOIN asset A ON PO.purchase_order_key = A.purchase_order_key
GROUP BY PO.purchase_order_key, PO.number_of_assets
HAVING COUNT(*) > PO.number_of_assets

我想这就是你想要的:

SELECT
    PO.*
FROM
    purchase_order PO
    INNER JOIN
        (
            SELECT 
                A.purchase_order_key,
                COUNT(A.asset_key) asset_key_count
            FROM
                asset A
            GROUP BY
                A.purchase_order_key

        ) AC on AC.purchase_order_key = PO.purchase_order_key and AC.asset_key_count < PO.number_of_assets

如果没有资产行,可能需要左联接。然后您需要处理空值,countall asset.purchase\u order\u key可以吗?我不知道这是否是特定于TSQL的问题,但此查询给了我一个错误:“purchase\u order.number\u of_assets”列在HAVING子句中无效,因为它不包含在聚合函数或GROUP BY子句中。它不是特定于TSQL的,您需要将purchase\u order.number\u of_assets添加到GROUP BY子句中。见编辑关闭;Jason Goemaat的密码成功了。这个位给了我所有的记录,除了那些资产记录数为0的记录。
SELECT PO.purchase_order_key, COUNT(A.purchase_order_key)
FROM purchase_order PO
    LEFT JOIN asset A ON PO.purchase_order_key = A.purchase_order_key
GROUP BY PO.purchase_order_key, PO.number_of_assets
HAVING COUNT(*) > PO.number_of_assets
SELECT
    PO.*
FROM
    purchase_order PO
    INNER JOIN
        (
            SELECT 
                A.purchase_order_key,
                COUNT(A.asset_key) asset_key_count
            FROM
                asset A
            GROUP BY
                A.purchase_order_key

        ) AC on AC.purchase_order_key = PO.purchase_order_key and AC.asset_key_count < PO.number_of_assets