2017-08-15 61 views
0

我有如下表:除以行即可百分比

Pets | Monday| Tuesday| Wednesday| Thursday| Friday 
Dogs | 12 | 11 | 8  |  3 | 0 
Cats | 16 | 13 | 5  |  8 | 4 
Fish | 45 | 27 | 20 |  35 | 22 
Birds| 3  | 3 | 3  |  3 | 2 

我試圖返回相比,最新的日子,所以返回例如總寵物的每個寵物的百分比會是這樣的:

Pets | Friday| Percentage 
Dogs | 0 |  0% 
Cats | 4 |  14.2% 
Fish | 22 |  78% 
Birds| 2 |  8.3% 

我想這樣做,每天在那裏我已成立了一個腳本,在第二天(星期六)等新表將需要出示週六結果會自動填充。

我正沿着下面的腳本的思路思考,我需要一些投報表等扔得到它返回一個表,但是想看看,如果我是在正確的線路:

SELECT Friday/(SELECT SUM([Friday]) FROM PetSitting) from PetSitting group by pets 

這裏的困難在於讓SQL識別一個行列,然後將它劃分爲相同的列以獲得一個百分比,然後轉到下一行並執行相同的操作,直到獲得上述所需結果的百分比列表。

+0

什麼版本的SQL服務器 – scsimon

+0

我會說PIVOT可以工作,但只有你的表星期一 - 星期天,然後重新開始?或者它是如何工作的? –

+0

對於鳥類,你確定這是正確的百分比嗎? – scsimon

回答

0

如果我明白你的問題,也許有點動態SQL

Declare @Day varchar(50)='Friday' 

Declare @SQL varchar(max) = ' 
Select Pets 
     ,'[email protected]+'  = sum('[email protected]+') over (Partition By Pets) 
     ,Percentage = format(sum('[email protected]+'*1.0) over (Partition By Pets)/sum('[email protected]+') over(),''0.#%'') 
From YourTable 
' 
Exec(@SQL) 

返回

enter image description here

2

聽起來像一個簡單的聚合。另外,添加更多列不會改變結果。爲了清晰起見,我僅限制了示例數據。

declare @table table (Pets varchar(8), Friday int) 
insert into @table 
values 
('Dogs',0), 
('Cats',4), 
('Fish',22), 
('Birds',2) 


select 
    Pets 
    ,Friday 
    ,Percentage = convert(decimal(3,1),100 * (Friday/((Sum(Friday) over (order by (select null))) * 1.0))) 
from 
    @table 
group by 
    Pets 
    ,Friday 

退貨

+-------+--------+------------+ 
| Pets | Friday | Percentage | 
+-------+--------+------------+ 
| Birds |  2 |  7.1 | 
| Cats |  4 |  14.3 | 
| Dogs |  0 |  0.0 | 
| Fish |  22 |  78.6 | 
+-------+--------+------------+ 
1

我會鼓勵你去看看你的表的設計。我在這裏給出一個例子,使用表變量而不是表(這樣就可以在查詢窗口中運行它):

declare @pets table 
(
Pet varchar(10), 
SaleNumber int, 
SaleDate date 
) 
INSERT INTO @pets VALUES 
('Dogs', 12, '2017-08-07'), 
('Dogs', 11, '2017-08-08'), 
('Dogs', 8, '2017-08-09'), 
('Dogs', 3, '2017-08-10'), 
('Dogs', 0, '2017-08-11'), 
('Cats', 16, '2017-08-07'), 
('Cats', 13, '2017-08-08'), 
('Cats', 5, '2017-08-09'), 
('Cats', 8, '2017-08-10'), 
('Cats', 4, '2017-08-11'), 
('Fish', 45, '2017-08-07'), 
('Fish', 27, '2017-08-08'), 
('Fish', 20, '2017-08-09'), 
('Fish', 35, '2017-08-10'), 
('Fish', 22, '2017-08-11'), 
('Birds', 3, '2017-08-07'), 
('Birds', 3, '2017-08-08'), 
('Birds', 3, '2017-08-09'), 
('Birds', 3, '2017-08-10'), 
('Birds', 2, '2017-08-11') 

declare @lastdate date = (SELECT max(saledate) as lastdate FROM @pets) 
declare @lastsum float = (SELECT sum(salenumber) as petsum FROM @pets 
WHERE saledate = @lastdate) 

SELECT Pet, SaleNumber, Datename(dw,saledate) AS [Day of Week], 
salenumber/@lastsum as [Percentage of Day's Sales] 
FROM @pets WHERE saledate = @lastdate 

結果看起來是這樣的:

Pet SaleNumber Day of Week Percentage of Day's Sales 
Dogs 0 Friday 0 
Cats 4 Friday 0.142857142857143 
Fish 22 Friday 0.785714285714286 
Birds 2 Friday 0.0714285714285714 

佈置您的這樣的表格,意味着您可以每天簡單地添加記錄,而不必更改表格,而上述查詢將自動獲取最後幾天的值。

+0

這是存儲表格的更好的方法,我將在下一個任務中實現這一點,但現在我正在複製在我的問題中顯示的歷史示例。不過謝謝你。 – VS1SQL