2015-09-10 52 views
1

我有一個Sales_Table在列季百分比SQL查詢作爲每季度在另一列給出

month quarter sales 
1  1  100 
2  1  200 
3  1  300 
4  2  400 
5  2  500 
6  2  600 

我想有銷售額的季度百分比(季刊列)

month quarter sales  Quarterly 
1  1  100   17% 
2  1  200   33% 
3  1  300   50% 
4  2  400   27% 
5  2  500   33% 
6  2  600   40% 
結果

所用式I:
(基本上季刊=(銷售* 100 /總在同一季度的銷售額)的

這是我的查詢:

Select sales, month, quarter, sales * 100.0/(select Sum(sales) from Sales_Table group by quarter) as quarterly 
from Sales_Table 
group by month; 

這給我造成:

sales month quarter quarterly 
100  1  1  16.666666666666668 
200  2  1  33.333333333333336 
300  3  1  50 
400  4  2  66.66666666666667 
500  5  2  83.33333333333333 
600  6  2  100 

這一結果顯示了季度1正確季度值,但不正確季度2

請幫助我正確季度2季度列值也是如此。

+2

從銷售表格中選擇銷售額,月份,季度,銷售額* 100.0 /(從Sales_Table選擇總和(銷售額)s WHERE s.quarter = m.quarter) –

+0

爲什麼要添加excel標籤? – Balinti

+0

@DmitryPoliakov把你的評論作爲回答 – Alex

回答

0

我會做的季度計算的from子句中使用子查詢:

Select st.sales, st.month, st.quarter, 
     (st.sales * 100.0/q.sales) as quarterly 
from Sales_Table st join 
    (select quarter, sum(sales) as sales 
     from Sales_Table 
     group by quarter 
    ) q 
    on st.quarter = q.quarter; 

如果要格式化這是一個百分比,那麼你可以使用:

concat(format(st.sales * 100.0/q.sales, 2), '%') 
0

http://sqlfiddle.com/#!9/454ba/6

SELECT s.sales, s.month, s.quarter, (s.sales * 100/(q.q_sales)) as quarterly 
FROM Sales_Table s 
LEFT JOIN (
    SELECT quarter, SUM(sales) as q_sales 
    FROM Sales_Table 
    GROUP BY quarter) as q 
ON q.quarter = s.quarter 
0

您的查詢編輯最少:

Select 
    sales, 
    month, 
    quarter, 
    sales * 100.0/(select Sum(sales) from Sales_Table s WHERE s.quarter=m.quarter) as quarterly 
from Sales_Table m 
0

這是一個非標量子查詢。我懷疑MySQL正在隨機使用其中一個值,就像您在引用非分組列時沒有集合函數一樣。這就是爲什麼一個是對的,另一個不是。 (如果你檢查數學,你會發現600是所有計算中的除數。)我認爲你可以通過關聯quarter來修復你的查詢。

select 
    sales, month, quarter, 
    sales * 100.0/(
     select sum(sales) from Sales_Table st2 
     where st2.quarter = st.quarter 
     group by quarter 
    ) as quarterly 
from Sales_Table st 

其實你還做了我提到的,當你按一個月,然後包括在輸出salesquarter整個非聚集列的東西。在這種情況下,你不需要這個組,因爲你所有的行都在他們自己的組中。但是MySQL允許你在其他平臺給你一個錯誤的地方運行這個查詢。