2015-06-14 220 views
0

我有一个客户表,项目表,并以下列的事务表计数功能计数所有行SQL如果条件满足

交易 - ID,客户ID(外键的客户(ID)),项目ID(外键编号(ID))

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

如果某个特定客户参与了涉及给定ItemID的交易(即,客户购买了一个特定的项目),返回客户参与的交易总数的计数。这个技巧(以及我自己无法解决的部分)是如何在不涉及ItemID用于查询中。

+3

显示你对解决方案的努力很有礼貌。 –

回答

2

您可以分两步解决这个问题:

  1. 编写返回有关客户ID的查询。如果您将该查询写为子查询或CTE(公用表表达式,即WITH子句),则甚至不需要将结果放在临时表中。

  2. 将来自(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进行过滤的“外部”查询。

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

如果客户123尚未参与交易的项目456,那么该查询将返回0的计数,因为子查询中,它没有客户ID条目。

+0

嗨吉姆,这是接近答案,但我正在寻找一种方法来实现你没有在嵌套的select语句中指定custID。 –

+1

在这种情况下,我认为stakx的答案就是你要找的。 –

+0

@MarkD,你想避免嵌套select语句的原因是什么? – jarlh

0

对于“如果某个特定的客户参与了涉及给定项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

0

谢谢吉姆 提醒我有关的地方在哪里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,我一直在寻找在你明明提供一个同时的答案。

+0

我可能会误解,但我怀疑这只适用于最多只能由一位顾客购买商品的情况。如果有几个顾客可以购买同一件商品,那么'COUNT(...)'不会区分它们。请注意这一点。无论哪种情况,如果您找到适合您的解决方案,我很高兴! – stakx