Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据分组在一起的行向SQL表添加另一列_Sql_Sql Server - Fatal编程技术网

如何根据分组在一起的行向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。