2
我有一些表像下面的例子:查詢爲具有良好性能的許多列calculationg百分比
[myCategory] [mySales]
+------+---------+ +------------+-----+--------+-------+
| id | name | | date | cat | price | code |
+------+---------+ +------------+-----+--------+-------+
| 1 | cat1 | | 2015/01/01 | 1 | 25000 | 2 |
| 2 | cat2 | | 2015/01/01 | 2 | 32000 | 4 |
| 3 | cat3 | | 2015/02/01 | 1 | 25000 | 6 |
| 4 | cat4 | | 2015/02/01 | 3 | 40000 | 4 |
: .. : ... : : ... : .. : : .. :
+------+---------+ +------------+-----+--------+-------+
\---------------- Foreign Key ----------------/
我試圖得到這樣的結果:
[results are between @fromDate and @toDate]
+------+-----------+-----------+-------------+---------------+-...-+
| code | totalSale | prcntSale | ttlSaleCat1 | prcntSaleCat1 | ... |
+------+-----------+-----------+-------------+---------------+-...-+
| 2 | 25000 | 20 | 25000 | 50 | ... |
| 4 | 72000 | 60 | 0 | 0 | ... |
| 6 | 25000 | 20 | 25000 | 50 | ... |
: .. : ... : .. : ... : .. : ... :
+------+-----------+-----------+-------------+---------------+-...-+
我的問題是關於計算百分比。
現在我已經宣佈了一些變量在我的存儲每個類別的程序,並收集總各ttlSaleN
列,然後在主查詢使用它們,我的解決方案應該變得更快了,我想我應該改變我的解決辦法。
我的查詢是這樣的:
Declare @totalSale money = (select sum(s.price)
from mySales s
where s.date Between @fromDate and @toDate)
Declare @ttlSale1 money = (select sum(s.price)
from mySales s
where s.date Between @fromDate and @toDate and s.cat = 1)
...
select s.code, sum(s.price) as totalSale, sum(s.price) * 100/@totalSale as prcntSale
sum(case s.cat when 1 then s.price else 0 end) as ttlSaleCat1, sum(case s.cat when 1 then s.price else 0 end) * 100/@ttlSale1 as prcntSaleCat1
from mySales s
where s.date Between @fromDate and @toDate
group by s.code
所有這些數據樣本那些我寫他們剛纔,如果這些有任何問題,忽略它們)。
我認爲對所有計算使用單個查詢可以使其更快 - 刪除變量 - 如果我的方式不對,請指導我以正確的方式。
這是有點不清楚。你做單一陳述有問題嗎?如果不是,則只需製作另一個查詢並進行比較。如果不在生產環境中運行這兩個查詢,我們怎麼能假設一些查詢比其他更好呢? –
@GiorgiNakeuri我將刪除那些計算總和值來計算百分比的變量。 –
這是非常基本的原始查詢。我認爲你更好地通過索引和統計來優化,而不是通過優化那個查詢。 –