如何根据分组在一起的行向SQL表添加另一列
我有一张这样的桌子:如何根据分组在一起的行向SQL表添加另一列,sql,sql-server,Sql,Sql Server,我有一张这样的桌子: DATE ITEMS CLASS CATEGORY --------------------------------------------------------- 2016-10-01 17915 Red Apartment 2016-10-01 39246 Red Complex 2016-10-01 4376 Blue Apartment
DATE ITEMS CLASS CATEGORY
---------------------------------------------------------
2016-10-01 17915 Red Apartment
2016-10-01 39246 Red Complex
2016-10-01 4376 Blue Apartment
2016-10-01 12668 Blue Complex
2016-10-01 513 Yellow Apartment
2016-10-01 23271 Yellow Complex
DATE ITEMS CLASS CATEGORY OCCUPANCY
--------------------------------------------------------------------------
2016-10-01 17915 Red Apartment 17915 * 100 / 39246
2016-10-01 39246 Red Complex null
2016-10-01 4376 Blue Apartment 4376 * 100 / 12668
2016-10-01 12668 Blue Complex null
2016-10-01 513 Yellow Apartment 513 * 100 / 23271
2016-10-01 23271 Yellow Complex null
我想在此表中添加另一列,该列按类分组,并计算一个值占另一个值的百分比。例如,在上面的例子中,对于标记为Class=Red的两行,我想取公寓类别(17915)中项目的价值,并将其计算为复杂类别(39246)中项目价值的百分比,计算结果为49.64%,约为50%
因此,应用于上表的查询应生成如下所示的输出表:
DATE ITEMS CLASS CATEGORY
---------------------------------------------------------
2016-10-01 17915 Red Apartment
2016-10-01 39246 Red Complex
2016-10-01 4376 Blue Apartment
2016-10-01 12668 Blue Complex
2016-10-01 513 Yellow Apartment
2016-10-01 23271 Yellow Complex
DATE ITEMS CLASS CATEGORY OCCUPANCY
--------------------------------------------------------------------------
2016-10-01 17915 Red Apartment 17915 * 100 / 39246
2016-10-01 39246 Red Complex null
2016-10-01 4376 Blue Apartment 4376 * 100 / 12668
2016-10-01 12668 Blue Complex null
2016-10-01 513 Yellow Apartment 513 * 100 / 23271
2016-10-01 23271 Yellow Complex null
不是这些操作,而是实际值。对此的查询是什么样子的?我尝试了GROUPBY子句的各种变体,但我想不出在分组之后,有什么东西可以将一行与下一行进行比较。这是在MySQL中实现的一种方法,假设每个类始终具有单元和复杂的类别
select ta.date,ta.items,ta.class,ta.category,ta.items*100.0/tc.items occupancy
from t ta
join t tc on ta.date=tc.date and ta.class=tc.class
and ta.category='Apartment' and tc.category='Complex'
union all
select date,items,class,category,null
from t
where category='Complex'
在SQL Server中,可以使用窗口函数max
执行此操作
select date,items,class,category,
case when category = 'Apartment' then
max(case when category='Apartment' then items end) over(partition by date,class)*100.0
/max(case when category='Complex' then items end) over(partition by date,class)
end as occupancy
from t
您可以使用自联接和联合
select a.DATE, a.ITEMS, a.CLASS, a.CATEGORY, (a.ITEMS *100)/ b.ITEMS AS OCCUPANCY
from my_table as a
inner join my_table as b on a.class = b.classe
wheer a.CATEGORY = 'Apartment'
AND b.CATEGORY = 'Complex'
UNION
SELECT DATE, ITEMS, CLASS, CATEGORY, NULL
FROM my_table
where CATEGORY = 'Complex'
这个查询提出了一些假设。1.您的类别将始终是公寓式的和复杂的。2.这是SQL Server 2012(您用SQL Server标记了该问题)。我不确定这是否适用于MySql。只是抛出一个替代方案
SELECT
DATE,
ITEMS,
CLASS,
CATEGORY,
(ITEMS * 100)/ LEAD(ITEMS) OVER (PARTITION BY CLASS ORDER BY CATEGORY) AS OCCUPANCY
FROM Your_Table
mysql还是sql server?sql server,很抱歉给您添加了额外的标签谢谢,我应该在我的问题中澄清sql server。