我需要创建一个SQL语句,向我显示从2015年7月1日到2015年7月31日期间从特定产品类别购买产品的客户列表,但未购买产品2015年8月1日至2015年8月31日期间的相同产品类别。
表格是:
Customers: custId, fname, lname, custtype
Transactions: transid, datetrans, custid
TransItems: transid, productid, itemdescrip, quantity, price
Products: productid, productcatid, productcatgroupid
ProductCats: productcatid, productcatgroupid
到目前为止我所拥有的是:
SELECT Customers.custid,
Customers.lname,
Customers.fname,
Transactions.transid,
Transactions.transdate,
TransItems.productid,
TransItems.itemdescrip,
TransItems.price
FROM Transactions
INNER JOIN
WHERE (Transactions.datetrans BETWEEN '2015-07-01' AND '2015-07-31')
AND (ProductCat.productcatgroupid=2)
下一部分是我被困的地方。我需要查询然后查看08-01-2015
到08-31-2015
的日期范围,并告诉我这些客户中的任何一个是否在7月日期范围内有一个交易。
答案 0 :(得分:1)
这显示了您在7月活动中寻找的所有列,这些列在8月份没有同一客户对类似产品类别的活动。您在表之间缺少一堆连接以获取最终产品类别ID,并且在主级别和NOT EXISTS子查询中都需要它们。我从子查询中将子查询别名为“2”,如T2,TI2等,以便澄清。
SELECT
C.custid,
C.lname,
C.fname,
T.transid,
T.transdate,
TI.productid,
TI.itemdescrip,
TI.price
FROM
Transactions T
JOIN Customers C
on T.CustID = C.CustID
JOIN TransItems TI
on T.TransID = TI.TransID
JOIN Products P
on TI.ProductID = P.ProductID
AND P.ProductCatGroupID = 2
AND NOT EXISTS
( select
T2.CustID
from
Transactions T2
JOIN TransItems TI2
on T2.TransID = TI2.TransID
JOIN Products P2
on TI2.ProductID = P2.ProductID
AND P2.ProductCatGroupID = 2
WHERE
T2.CustID = T.CustID
AND T2.Datetrans BETWEEN '2015-08-01' AND '2015-08-31' )
WHERE
T.Datetrans BETWEEN '2015-07-01' AND '2015-07-31'
答案 1 :(得分:0)
此查询将使用户仅在8月份进行交易,并显示他们是否有7月份的另一个按客户和产品分组:
select T1.custId,T2.productId,
count(distinct case when Transactions.datetrans BETWEEN '2015-08-01' AND '2015-08-31' then T2.transid else null end) as Pur_Aug,
count(disitnct case when Transactions.datetrans BETWEEN '2015-07-01' AND '2015-07-31' then T2.transid else null end) Pur_Jul
from Transactions T1
Join TransItems T2 using(transid)
join Products P using(productId)
where productcatgroupid=2
group by custId,productId
order by custId,productId
having count(distinct case when Transactions.datetrans BETWEEN '2015-08-01' AND '2015-08-31' then T2.transid else null end)>0
我将计数区分开来只显示1或Null。