将行除以列的总和以获得百分比

Divide row by sum of column to get a percentage

我有以下 table:

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

我正在尝试 return 截至最近一天每只宠物占宠物总数的百分比,因此 return 示例将如下所示:

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

我想每天都这样做,我已经设置了一个脚本,该脚本会在第二天(星期六)自动填写,因此新的 table 将需要显示星期六的结果。

我在按照下面的脚本进行思考,我需要加入一些强制转换语句等以使其达到 return a table 但想看看我是否在正确的位置行:

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

这里的困难是 SQL 识别一个行列,然后将其除以同一列以获得百分比,然后移动到下一行并执行相同的操作等等,直到您得到一个列表与上述预期结果相似的百分比。

听起来像是一个简单的集合。此外,添加更多列不会改变结果。为了清楚起见,我只是限制了示例数据。

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

RETURNS

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

如果我理解你的问题,也许有点动态SQL

例子

Declare @Day varchar(50)='Friday'

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

Returns

我鼓励您看看您的 table 设计。我在这里举一个例子,使用 table 变量而不是 table (这样你就可以在查询 window 中 运行 ):

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

像这样布置您的 table,意味着您可以每天简单地添加记录,而无需更改您的 table,并且上述查询将自动获取最近几天的值。