2015-09-07 52 views
0

這裏是SQL小提琴如何根據日期列將行轉換爲列?

http://sqlfiddle.com/#!9/25542/2/0

我只想得到我的數據,

Sale_On | Count Refunded | Count Sale | Count Cashback 
------------------------------------------------------- 
2015-09-07 | 1   | 5  |  1 

我讀到了「的情況下,當」在MySQL,但在這種情況下,我必須寫每個order_status手動。

我該怎麼做?任何其他解決方案,而不是將行轉換爲列?

+0

奇怪的是'RIGHT JOIN' beween'orders'和'order_detail':如果'order_id'不'orders'存在,但確實存在於'order_detail'中,當然它應該在這個查詢中被忽略 - 即你想要一個* inner * join(如果你想包含'orders'中的'order_id's而不是'order_detail',那麼左連接也是合適的,儘管在這種情況下不會有'order_status' ,它不會有任何區別)。 – eggyal

+0

是的,它應該是內連接。我錯誤地寫了正確的加入。 –

+0

[更通用的答案](http://mysql.rjweb.org/doc.php/pivot)到「數據透視」問題。 –

回答

3

如果你很高興硬編碼的狀態,你可以對他們進行聚合:

SELECT DATE(o.sale_on), 
     SUM(od.order_status=1) AS Sales, 
     SUM(od.order_status=2) AS Refunds, 
     SUM(od.order_status=3) AS Cashbacks 
FROM  orders o RIGHT JOIN order_detail od USING (order_id) 
GROUP BY DATE(o.sale_on) 

見它sqlfiddle

否則,如果您需要動態生成類似的SQL,請在您的master_order_status表上使用查詢來生成選擇列表中的相應列。

+0

你能解釋一下這裏的用法是什麼?爲什麼我不能在這裏使用計數? –

+0

@SunilGarg:['COUNT(expr)'](https://dev.mysql.com/doc/en/group-by-functions.html#function_count)「*返回非'NULL 'SELECT'語句*「所檢索的行中**'expr' **的值。由於布爾表達式「od.order_status = 1」等總是計算爲1或0,它們總是非'NULL'。您希望將這些1加起來,即[SUM()'](https://dev.mysql.com/doc/en/group-by-functions.html#function_sum)。 – eggyal

+0

我們不能動態地做到這一點嗎?它不應該手動提及每個狀態,而應該從master_order_status自動獲取它。 –

0

或試試這個

select sale_on, 
max(case when status='sale' then c end) as count_Sales, 
max(case when status='Refunded' then c end) as count_Refunded, 
max(case when status='CashBack' then c end) as count_CashBack 
from 
(
SELECT o.sale_on,od.order_status,COUNT(*) as c,mos.status FROM orders o 
RIGHT JOIN order_detail od ON o.order_id = od.order_id 
LEFT JOIN `master_order_status` mos ON mos.`status_id` = od.order_status 
GROUP BY DATE(o.sale_on),od.order_status 
) as t group by sale_on 

SQL小提琴http://sqlfiddle.com/#!9/25542/13