2014-09-05 124 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