将行除以列的总和以获得百分比
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,并且上述查询将自动获取最近几天的值。
我有以下 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,并且上述查询将自动获取最近几天的值。