如果满足条件,SQL Count 函数计算所有行
Posted
技术标签:
【中文标题】如果满足条件,SQL Count 函数计算所有行【英文标题】:SQL Count function count all rows if a condition is met 【发布时间】:2015-06-14 06:55:40 【问题描述】:我有一个客户表、一个项目表和一个包含以下列的交易表:
客户 - ID、姓名
项目 - ID、描述
Transaction - ID, CustID(外键Customer(ID)), ItemID(外键Item(ID))
使用这个查询,谁能帮我创建一个查询来回答以下问题:
如果特定客户参与了涉及给定 ItemID 的交易(即客户购买了特定商品),则返回该客户参与的交易总数的计数。技巧(以及部分我自己无法解决)是如何将不涉及查询中使用的 ItemID 的事务包括在计数中。
【问题讨论】:
表现出您为解决方案所做的努力是有礼貌的。 【参考方案1】:你可以分两步解决这个问题:
编写一个返回相关客户 ID 的查询。如果您将该查询编写为子查询或 CTE(通用表表达式,即 WITH
子句),您甚至不需要将结果放入临时表中。
将 (1) 中的结果表加入事务表(以过滤掉您不感兴趣的所有事务),然后按客户 ID 分组(以便您可以使用 @987654322 中的聚合函数@ 子句),然后选择 COUNT(DISTINCT TransactionId)
。
类似的东西:
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 过滤的“外部”查询中。
【讨论】:
【参考方案2】:select count(*) from Transaction where CustID in (select CustID from Transaction where CustID = 123 and ItemID = 456)
如果客户 123 没有参与商品 456 的交易,则查询将返回计数 0,因为子查询中没有 custid 条目。
【讨论】:
嗨,Jim,这与答案很接近,但我正在寻找一种方法来实现您所拥有的,而无需在嵌套的 select 语句中指定 custID。 在这种情况下,我认为 stakx 的答案就是你要找的。span> @MarkD,你想避免嵌套选择语句的原因是什么?【参考方案3】:谢谢吉姆 提醒我 WHERE something is 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 道歉,我正在寻找答案,而您显然正在提供答案。
【讨论】:
我可能弄错了,但我怀疑这仅适用于最多一个客户可以购买的商品。如果多个客户可以购买相同的商品,COUNT(…)
将无法区分它们。请注意这一点。无论哪种情况,如果您找到适合您的解决方案,我都会很高兴!【参考方案4】:
对于“如果特定客户参与了涉及给定 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。
问候 帕里托什
【讨论】:
以上是关于如果满足条件,SQL Count 函数计算所有行的主要内容,如果未能解决你的问题,请参考以下文章