2015-12-12 23 views
1

問候, 所看到的許多帖子在這裏和那裏,子查詢比加入慢...我如何使用Join來代替子查詢進行下列查詢?

,但使用任何連接方法我不能找到一種方法,使下面的查詢..所以,我用子查詢。

任何一個可以告訴我如何正確使用加入了以下情況:

表1:

customerID, Name 
1, abc 
2, xyz 
3, qwe 
4, zxc 
5, asd 
and so on 

表2:

customerID, Month, OrderNumbers 
1, jan, 5 
1, feb, 6 
2, jan, 8 
3, feb, 5 
4, mar, 3 
and so on.. 

我需要做報告像這樣:

customer id, name, jan order, feb order, mar order 
1, abc, 5, 6, 0 
2. xyz, 8, 0, 0 
3. qwe, 0, 5, 0 
and so on 

我使用這個查詢:

select table1.customerID, 
     table1.Name, 
     (select table2.Month as jan 
     where table2.Month = jan), 
     (select table2.Month as feb 
     where table2.Month = feb), 
     (select table2.Month as mar 
     where table2.Month = mar) 
    from table1 

但這不工作,因爲它應該...

所以,我怎麼能做到這一點?

+0

你需要一個數據透視表。檢查了這一點http://stackoverflow.com/questions/7674786/mysql-pivot-table –

回答

1

您的查詢基本上需要一個漫長的廣泛重塑或轉置轉換可與有條件的聚集來完成:

SELECT 
    table1.customerID, 
    table1.`name`,  

    SUM(CASE WHEN table2.`Month` = 'jan' THEN table2.`OrderNumbers` END) As 'jan order', 
    SUM(CASE WHEN table2.`Month` = 'feb' THEN table2.`OrderNumbers` END) As 'feb order', 
    SUM(CASE WHEN table2.`Month` = 'mar' THEN table2.`OrderNumbers` END) As 'mar order', 
    SUM(CASE WHEN table2.`Month` = 'apr' THEN table2.`OrderNumbers` END) As 'arp order', 
    SUM(CASE WHEN table2.`Month` = 'may' THEN table2.`OrderNumbers` END) As 'may order', 
    SUM(CASE WHEN table2.`Month` = 'jun' THEN table2.`OrderNumbers` END) As 'jun order', 
    SUM(CASE WHEN table2.`Month` = 'jul' THEN table2.`OrderNumbers` END) As 'jul order', 
    SUM(CASE WHEN table2.`Month` = 'aug' THEN table2.`OrderNumbers` END) As 'aug order', 
    SUM(CASE WHEN table2.`Month` = 'sep' THEN table2.`OrderNumbers` END) As 'sep order', 
    SUM(CASE WHEN table2.`Month` = 'oct' THEN table2.`OrderNumbers` END) As 'oct order', 
    SUM(CASE WHEN table2.`Month` = 'nov' THEN table2.`OrderNumbers` END) As 'nov order', 
    SUM(CASE WHEN table2.`Month` = 'dec' THEN table2.`OrderNumbers` END) As 'dec order' 

FROM 
    table1 
LEFT OUTER JOIN 
    tabl2 ON table1.customerID = table2.customerID 
GROUP BY 
    table1.customerID, 
    table1.`name` 
+0

感謝很多作品像魅力:)。保重,願真主保佑你,祝你有美好的一天,再見... –

+0

先生,另一個問題,我如何在同一查詢中添加總訂單字段?你能幫我解決嗎?目前我通過所有行/數組循環,並做計算..但我認爲可以完成相同的SQL查詢? –

0

下面是我用在mSQL的多次解決方案......

select customerID,Name,sum(jan) as jan,sum(feb) as feb from(
select table1.customerID,Name,(case when Month = 'jan' then OrderNumbers else 0 end) as jan, select table1.customerID,Name,(case when Month = 'feb' then OrderNumbers else 0 end) as febfrom table1 
left join table2 on table2.customerID = table1.customerID 
) as src group by customerID,Name 

基本上你使用select情況下,只用其中任何一個給你的東西一樣

銷售或0填充一個月
1,abc,5,0,0 
1,abc,0,3,0 
2,ddd,0,0,5 

然後,您只需將結果分組並計算月份。