2015-09-23 63 views
-1

我需要創建一條SQL語句,該語句將向我顯示從第一個特定產品類別購買產品的客戶列表,請說2015年7月1日2015年通7月31日,但是從同一產品類別在期間兩人沒有購買產品2015年8月1日,通8月31日,2015年需要SQL幫助:在日期範圍一,但不在日期範圍內的客戶交易

表是:

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的日期範圍,並告訴我這些客戶在七月日期範圍內有一個客戶沒有在該範圍內的交易。

+2

你的'Inner Join'似乎缺乏實質性。 – Siyual

+2

哪一個RDBMS是爲了這個?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 –

回答

1

這顯示了您在7月份活動中查找的所有列,這些列在8月份沒有針對同一客戶的類似產品類別的活動。您錯過了表之間的一堆連接以獲取最終產品類別標識,並且在主級別和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' 
0

此查詢將用戶只在八月進行的交易,並表示,如果他們有通過客戶和產品組合從七月另一個問題:

 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或空。

+0

他們正在尋找非常具體的產品類別,要求您通過整個層次結構查看產品表並將其納入整個子條件測試。 – DRapp