需要的SQL帮助:日期范围为1的交易,但客户

时间:2015-09-23 18:06:30

标签: sql

我需要创建一个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-201508-31-2015的日期范围,并告诉我这些客户中的任何一个是否在7月日期范围内有一个交易。

2 个答案:

答案 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。