我有一个看起来像这样的表:
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
我想在此表中添加另一列,按CLASS分组并计算一个值作为另一个的百分比。例如,在上面的例子中,对于标记为Class = Red的两行,我想获取Apartment类别(17915)中Items的值,并将其计算为Complex类别中Items的值的百分比(39246) ),其效果为49.64%,约为50%。
因此,应用于上表的查询应该生成一个如下所示的输出表:
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
不是那些操作,而是实际值。这个查询会是什么样的?我尝试了GROUP BY子句的变体,但在分组之后,我想不出任何比较一行和下一行的东西。
答案 0 :(得分:1)
您可以使用自我加入和联合
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 :(得分:0)
这是一种在MySQL中执行此操作的方法,假设每个类始终具有类别Apartment和Complex。
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
答案 2 :(得分:0)
此查询做了一些假设。 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