2014-09-05 50 views
1

考慮模擬表子查詢或有條件的邏輯結果集

ORDERS       
OrderID CustID date    
10  1  2014-01-01  
11  3  2014-02-01  
12  2  2014-03-01   

CUSTOMER 
CustID FName LName 
1  Jon Doe   
2  Jane Doe 
3  Mike Brown 

LINEITEM       
OrderID ProdID     
10  1       
10  3      
11  2      
12  1 
12  2 

PRODUCTS 
ProdID Description 
1  Apple 
2  Orange 
3  Grape 

我想返回的結果集,看起來像這樣:

OrderID CustomerLastName Apple Orange Grape 
11  Brown   No Yes No 
12  Doe    Yes Yes No 

邏輯:選擇單編號,客戶姓名,確定如果他們爲訂單日期大於2014-01-01的所有訂單購買了每種產品(是或否) 。

這是關於據我可以得到

select O.OrderID as 'OrderID', 
     C.LName as 'CustomerLastName', 
     (some conditional or subquery for figuring out yes or no) as 'Apple', 
     (some conditional or subquery for figuring out yes or no) as 'Orange', 
     (some conditional or subquery for figuring out yes or no) as 'Grape' 
from ORDERS O join CUSTOMER C using (CustID) 
       join LINEITEM using (OrderID) 
       join Products P using (ProdID) 
where O.date > 2014-01-01; 

如何獲得任何幫助每個訂單隻有一行返回,YES /對產品沒有邏輯將不勝感激。

謝謝

+0

對不起,這些表沒有保留原始文本框的格式。試試這個 – SciGuyMcQ 2014-09-05 00:11:29

+0

請不要將表格並排放置,它會使複製粘貼變成sqlfiddle困難。 – Barmar 2014-09-05 00:13:15

回答

0

什麼,我在我的意見是躲避我總是將「假」使用MAX(當時條件語句),如果你想玩玩吧:)

透視表
SELECT 
    O.OrderID, C.LName AS CustomerLastName, 
    MAX(CASE WHEN P.Description = 'Apple' THEN 'Yes' ELSE 'No' END) AS Apple, 
    MAX(CASE WHEN P.Description = 'Orange')THEN 'Yes' ELSE 'No' END) AS Orange, 
    MAX(CASE WHEN P.Description = 'Grape')THEN 'Yes' ELSE 'No' END) AS Grape 
FROM ORDERS AS O 
JOIN CUSTOMER AS C USING (CustID) 
JOIN LINEITEM AS L USING (OrderID) 
JOIN Products AS P USING (ProdID) 
WHERE O.date > '2014-01-01' 
GROUP BY O.OrderID, C.CustID 
+0

你們搖滾,這只是讓工作方式的報告更容易! – SciGuyMcQ 2014-09-05 01:12:12

+0

@ user3182105不客氣:)很高興我們可以幫助! – 2014-09-05 01:13:46

+0

@ user3182105你能接受答案嗎?這將不勝感激 :) – 2014-09-06 20:24:45

1

這實質上只是表的一個支點。與通常的關鍵點唯一的區別在於,您只需要yes/no,而不是每個pivoted列的行中的聚合值。

SELECT O.OrderID, C.LName AS CustomerLastName, 
     IF(MAX(P.Description = 'Apple'), 'Yes', 'No') AS Apple, 
     IF(MAX(P.Description = 'Orange'), 'Yes', 'No') AS Orange, 
     IF(MAX(P.Description = 'Grape'), 'Yes', 'No') AS Grape 
FROM ORDERS AS O 
JOIN CUSTOMER AS C USING (CustID) 
JOIN LINEITEM AS L USING (OrderID) 
JOIN Products AS P USING (ProdID) 
WHERE O.date > '2014-01-01' 
GROUP BY O.OrderID, C.CustID 

DEMO

+0

有趣......我總是'假'一個數據透視表,相反的方式做'MAX(IF('我想知道一種方式比另一種更好/更快? – 2014-09-05 00:26:23

+0

不知道哪個更好,它可能沒有什麼不同。 – Barmar 2014-09-05 00:27:47

+0

是啊,聽起來像是我應該測試的東西:) +1不管! – 2014-09-05 00:29:28