如何根据组合在一起的行将另一列添加到SQL表中

时间:2016-11-11 21:55:10

标签: 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
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子句的变体,但在分组之后,我想不出任何比较一行和下一行的东西。

3 个答案:

答案 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