如果满足条件,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 函数计算所有行的主要内容,如果未能解决你的问题,请参考以下文章

如果满足条件,则退出 H2 sql 脚本

sql中的count是啥意思呢,求例子

子查询分组后主查询怎么接收count

如果存在并满足多个条件,如何更新行,否则如何在 SQL Server 中插入

T-SQL 聚合函数Count与NULL

select count函数怎么用