我有一个客户表,项目表,并以下列的事务表计数功能计数所有行SQL如果条件满足
交易 - ID,客户ID(外键的客户(ID)),项目ID(外键编号(ID))
使用此查询,任何人可以帮助我创建一个查询来回答以下问题:
如果某个特定客户参与了涉及给定ItemID的交易(即,客户购买了一个特定的项目),返回客户参与的交易总数的计数。这个技巧(以及我自己无法解决的部分)是如何在不涉及ItemID用于查询中。
我有一个客户表,项目表,并以下列的事务表计数功能计数所有行SQL如果条件满足
交易 - ID,客户ID(外键的客户(ID)),项目ID(外键编号(ID))
使用此查询,任何人可以帮助我创建一个查询来回答以下问题:
如果某个特定客户参与了涉及给定ItemID的交易(即,客户购买了一个特定的项目),返回客户参与的交易总数的计数。这个技巧(以及我自己无法解决的部分)是如何在不涉及ItemID用于查询中。
您可以分两步解决这个问题:
编写返回有关客户ID的查询。如果您将该查询写为子查询或CTE(公用表表达式,即WITH
子句),则甚至不需要将结果放在临时表中。
将来自(1)的结果表加入交易表(筛选出您不感兴趣的所有交易),然后按客户ID分组(以便您可以使用SELECT
子句中的聚合函数) ,并选择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
这给你一个集合中的所有客户(通过其ID)购买了123项,与交易的每一个这些总数一起。
如果您只对一个特定客户感兴趣,可以将WHERE
子句添加到通过该客户ID进行过滤的“外部”查询。
select count(*) from Transaction where CustID in (select CustID from Transaction where CustID = 123 and ItemID = 456)
如果客户123尚未参与交易的项目456,那么该查询将返回0的计数,因为子查询中,它没有客户ID条目。
嗨吉姆,这是接近答案,但我正在寻找一种方法来实现你没有在嵌套的select语句中指定custID。 –
在这种情况下,我认为stakx的答案就是你要找的。 –
@MarkD,你想避免嵌套select语句的原因是什么? – jarlh
对于“如果某个特定的客户参与了涉及给定项ID交易” - 你的意思是你有客户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
谢谢吉姆 提醒我有关的地方在哪里IN(嵌套查询)让我在正确的轨道上。
我想出了如下回答我的问题:
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(...)'不会区分它们。请注意这一点。无论哪种情况,如果您找到适合您的解决方案,我很高兴! – stakx
显示你对解决方案的努力很有礼貌。 –