Sql Server-基于条件的行汇总

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/年的其他行合并为一行。

我正在使用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。您可以通过以下方式处理此问题:

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