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

时间:2015-06-14 06:55:40

标签: sql count

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

客户 - 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道歉,我在寻找答案的同时你显然提供答案。