2015-07-20 36 views
1

我試圖裝置激勵計劃,根據訂單的數量我的代理銷售,並轉移他們的工作。獲取特定計數Mysql的使用情況/如果

sales表(MySQL的)具有以下列:

sale_id (int, primary, auto increment) 
employee (varchar, 255) 
sale_time (datetime, the time sale was placed) 
sale_amount (float 10,2) 
sales_channel (tinyint, with values call (1), walk_in (2),referral(3)) 
is_cancelled (tinyint, with values 1 for cancelled, and 0 as default) 
(and a few other columns that are not relevant for this case) 

我想要編寫一個查詢來獲取與下面的列(我用的訂單和銷售互換)的結果:

employee 
total_orders (count excluding cancelled sales, i.e. is_cancelled!= 1) 
orders_below_100dollars (orders count with sale_amount below 100 and is_cancelled = 0) 
orders_above_100dollars (orders count with sale_amount above 100 and is_cancelled = 0) 
orders_dayShift (orders count placed between 9am and before 10pm and is_cancelled = 0) 
orders_nightShift (orders count placed after 10pm and before next day 9am and is_cancelled = 0) 
cancelled_orders (orders count with is_cancelled = 1) 

我明白是t他的查詢將有group by,caseif/else在選擇,但不能正確框架。請幫忙。

+0

你沒有,如果total_orders和orders_below精確等應包含在每個類別或金額的訂單數量總計。 –

+0

將編輯感謝。我的意思是伯爵。 –

回答

2

您可以使用條件聚合的很多這些。換句話說,把一個SUM()函數內的條件獲得的行符合一定條件的計數:

SELECT employee, 
    SUM(is_cancelled <> 1) AS totalOrders, 
    SUM(sale_amount < 100 AND is_cancelled <> 1) AS orders_below_100, 
    SUM(sale_amount > 10 AND is_cancelled <> 1) AS orders_above_100, 
    SUM(sale_time < '22:00:00' AND is_cancelled <> 1) AS orders_dayshift, 
    SUM(sale_time > '22:00:00' AND is_cancelled <> 1) AS orders_nightshift, 
    SUM(is_cancelled = 1) AS totalCanceled 
FROM sales 
GROUP BY employee; 
+0

@jpw我不知道這是非標準的,這是我從SO挑選的策略。當我有更多的相關信息時,我會對該主題進行一些研究並編輯我的答案。謝謝! – AdamMc331

+0

謝謝,我會試試這個。而不是order_time它是sale_time –

+0

@SantoshAchari對不起。我也不確定你以什麼類型存儲sale_time,所以我不確定你的條件是什麼,但我相信你至少可以弄清楚這一部分。 – AdamMc331

3

您正在尋找使用條件聚合 - 這裏有幾個例子:

select employee, 
     sum(case when is_cancelled != 1 then 1 else 0 end) total_orders, 
     sum(case when sale_amount < 100 then 1 else 0 end) orders_below_100dollars, 
     sum(case when sale_amount >= 100 then 1 else 0 end) orders_above_100dollars, 
     ... 
from sales 
group by employee 

我不太確定什麼是白天夜間VS,但它應該是很容易添加給出的上方。

+0

偉大的思想都相似!這些可以縮寫爲'SUM(is_cancelled!= 1)',而不是在每個語句中使用case語句。 – AdamMc331

+1

@ McAdam331 - 是的,我發現這更容易閱讀,並且在不同的數據庫中更一致。但我同意,時機良好。 – sgeddes

+0

白天,夜間與sale_time –