Sql Server-基于条件的行汇总
我正在使用Sql Server,我必须减少一些有条件的行,并将“小时”字段和成新行 情况是这样的 如果ID1==1或2,且ID2和年份相同,则应将小时数相加到一个ID1=4的新行中 ID1 ID2 年 小时 1. 2441 2021 4,03 2. 2441 2021 无效的 1. 2468 2021 30 2. 2468 2021 31,21 3. 2441 2021 145,99 可以使用大小写表达式。为了避免重复,我建议使用以下值: 注意:这将具有相同id1/id2/年的其他行合并为一行。如果不希望这样,则需要在原始表中使用唯一的id。您可以通过以下方式处理此问题:Sql Server-基于条件的行汇总,sql,sql-server,sql-server-2012,sql-server-2017,Sql,Sql Server,Sql Server 2012,Sql Server 2017,我正在使用Sql Server,我必须减少一些有条件的行,并将“小时”字段和成新行 情况是这样的 如果ID1==1或2,且ID2和年份相同,则应将小时数相加到一个ID1=4的新行中 ID1 ID2 年 小时 1. 2441 2021 4,03 2. 2441 2021 无效的 1. 2468 2021 30 2. 2468 2021 31,21 3. 2441 2021 145,99 可以使用大小写表达式。为了避免重复,我建议使用以下值: 注意:这将具有相同id1/id2/年的其他行合并为一行。
select v.id1, t.id2, t.year, sum(t.hour)
from (select t.*,
row_number() over (order by (select null)) as seqnum
from t
) t cross apply
(values (case when id1 in (1, 2) then 4 else id1 end)
) v(id1)
group by v.id1, t.id2, t.year,
(case when id1 <> 4 then seqnum end);
您似乎希望按ID2和年份分组
如果ID2和YEAR与上述相同,那么一种方法就是简单地用一个案例或IF来更改ID1,然后用一个组进行求和
SELECT CASE WHEN ID1 IN (1,2) THEN 4
ELSE ID1
END
,AVG(ID2)
,AVG(YEAR)
,SUM(HOUR)
FROM Table1
GROUP BY CASE WHEN ID1 IN (1,2) THEN 4
ELSE ID1
END
SELECT ID1 = (SELECT MAX(ID1) FROM tbl) + 1,
ID2,
[YEAR],
[HOUR] = SUM ([HOUR] )
FROM tbl
WHERE ID1 IN (1, 2)
GROUP BY ID2, [YEAR]
UNION ALL
SELECT ID1, ID2, [YEAR], [HOUR]
FROM tbl
WHERE ID1 NOT IN (1, 2)
SELECT CASE WHEN ID1 IN (1,2) THEN 4
ELSE ID1
END
,AVG(ID2)
,AVG(YEAR)
,SUM(HOUR)
FROM Table1
GROUP BY CASE WHEN ID1 IN (1,2) THEN 4
ELSE ID1
END