sql - 如果满足条件,SQL Count函数会计算所有行

sql - 如果满足条件,SQL Count函数会计算所有行,第1张

我有一个客户表,一个项目表和一个包含以下列的交易表:

客户 - ID,名称

项目 - ID,描述

交易 - ID,CustID(外键客户(ID)),ItemID(外键项(ID))

使用此查询,任何人都可以帮我创建一个查询来回答以下问题:

如果特定客户参与了涉及给定ItemID的交易(即客户购买了特定商品),则返回客户所涉及的交易总数的计数。诀窍(和部分)我不能自己解决)是如何在计数中包含不涉及查询中使用的ItemID的事务。

最佳答案:

4 个答案:

答案 0 :(得分:2)

您可以通过两个步骤解决此问题:

  1. 撰写一个返回相关客户的查询'标识。如果您将该查询编写为子查询或CTE(常用表表达式,即WITH子句),您甚至不需要将结果放在临时表中。

  2. 将结果表从(1)加入到事务表中(以过滤掉您不感兴趣的所有事务),然后按客户ID分组(以便您可以在SELECT子句,并选择COUNT(DISTINCT TransactionId)

  3. 这些方面的东西:

    WITH relevantCustomers (CustomerId) AS
    (
        SELECT DISTINCT CustomerId
        FROM Transactions
        WHERE ItemId = 123
    )
    SELECT t.CustomerId, COUNT(DISTINCT t.TransactionId)
    FROM Transactions t
    INNER JOIN relevantCustomers rc ON t.CustomerId = rc.CustomerId
    GROUP BY t.CustomerId
    

    这为您提供了一组购买项目123的所有客户(按其ID),以及每项客户的交易总数。

    如果您只对一个特定客户感兴趣,可以在"外部"中添加WHERE条款。查询按该客户的ID过滤。

    答案 1 :(得分:0)

    select count(*) from Transaction where CustID in (select CustID from Transaction where CustID = 123 and ItemID = 456)
    

    如果客户123没有参与项目456的事务,则查询将返回0,因为子查询中没有custid条目。

    答案 2 :(得分:0)

    对于“如果特定客户参与了涉及给定ItemID的交易” - 您的意思是您拥有客户ID和产品ID?如果是这样的话,您可以写 -

    SELECT * FROM TRANSACTION 
    where CUSTID={"your customer id"} 
    and ItemID = {"Required Item ID"} ;
    

    对于第二部分,您可以尝试这样的事情:

    Select count(*) from TRANSACTION 
    where CUSTID={"your customer id"} 
    and ItemID = {"Required Item ID"} ;
    

    您可以使用SQL查询here来更好地理解SQL。

    此致 Paritosh

    答案 3 :(得分:0)

    谢谢吉姆 提醒我关于什么东西是IN(NESTED QUERY)让我走上正轨。

    我已经提出了以下问题的答案:

    SELECT Name, Count(Name)
    FROM customer c
    JOIN transaction t
    ON c.ID = t.CustID
    WHERE CustID IN (SELECT CustID 
    FROM transaction
    WHERE ItemID = 2);
    

    向Stakx道歉,我在寻找答案的同时你显然提供答案。

    本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复