如何根据年份获取SQL结果?

如何根据年份获取SQL结果?,sql,sql-server,vbscript,Sql,Sql Server,Vbscript,例如: 表: +---+----+----+----+ | id|year| A | B | +---+----+----+----+ |101|2017| 50 | 40 | |102|2017| 40 | 45 | |103|2017| 80 | 15 | |104|2017| 0 | 0 | |101|2018| 65 | 75 | |102|2018| 50 | 40 | |103|2018| 25 | 55 | |104|2018| 0 | 0 | +---+----+--

例如:

表:

+---+----+----+----+
| id|year|  A |  B |
+---+----+----+----+
|101|2017| 50 | 40 |
|102|2017| 40 | 45 |
|103|2017| 80 | 15 |
|104|2017| 0  | 0  |
|101|2018| 65 | 75 |
|102|2018| 50 | 40 |
|103|2018| 25 | 55 |
|104|2018| 0  | 0  |
+---+----+----+----+
*下一年的数据等将被添加到表中

因此,根据上表,我想得出如下结果:

+---+--------------+--------------+-------------+
| id|Total for 2017|Total for 2018|Overall Total|
+---+--------------+--------------+-------------+
|101|     90       |     140      |    230      |
|102|     85       |     90       |    175      |
|103|     95       |     80       |    175      |
+---+--------------+--------------+-------------+
仅显示总总数不为零的id


是否有可以获得上述结果的查询?

最简单的方法是使用
条件聚合:

SELECT id
   ,SUM(CASE WHEN year=2017 THEN A+B ELSE 0 END) AS Total_for_2017
   ,SUM(CASE WHEN year=2018 THEN A+B ELSE 0 END) AS Total_for_2018
   ,SUM(A+B) AS Overall_Total
FROM tab
GROUP BY id;

如果A或B可为null,则应使用
ISNULL

对其进行包装。最简单的方法是使用
条件聚合

SELECT id
   ,SUM(CASE WHEN year=2017 THEN A+B ELSE 0 END) AS Total_for_2017
   ,SUM(CASE WHEN year=2018 THEN A+B ELSE 0 END) AS Total_for_2018
   ,SUM(A+B) AS Overall_Total
FROM tab
GROUP BY id;
select id,
       sum(case when year = 2017 then a+b else 0 end) as [2017],
       sum(case when year = 2018 then a+b else 0 end) as [2018],
       sum(a+b) as Total
from your_table
group by id
having sum(a+b) > 0

如果A或B可为null,则应使用
ISNULL

将其包装起来。您可以使用pivot处理更多动态数据。有关固定年数和动态年数,请参见下面的示例。试试看

select id,
       sum(case when year = 2017 then a+b else 0 end) as [2017],
       sum(case when year = 2018 then a+b else 0 end) as [2018],
       sum(a+b) as Total
from your_table
group by id
having sum(a+b) > 0
CREATE TABLE #yt 
( [id] int, [year] int,  [a] int,[b] int);
INSERT INTO #yt 
VALUES(101,2017,50,40),(102,2017,40,45),(103,2017,80,15)
     ,(104,2017,0,0),(101,2018,65,75),(102,2018,50,40)
     ,(103,2018,25,55),(104,2018,0,0)

 select *,[2017]+[2018] total from
 (select [id],[year],[a]+[b] as [total] from #yt)
 a1
 pivot
 (sum([total])
 for [year] in ([2017],[2018])
 ) piv

 DECLARE @cols AS NVARCHAR(MAX),
 @query  AS NVARCHAR(MAX)
 set  @cols = stuff((select ',' + QUOTENAME([year] ) from #yt group by 
 [year] order by [year] for xml path('')),1,1,'')

 set @query = ' select *,'+ replace(@cols,',','+') +' total from 
 (select [id],[year],[a]+[b] as [total] from #yt)
 a1
 pivot
 (sum([total]) for [year] in ('+@cols+')) piv'
 EXECUTE sp_executesql  @query 
 drop table   #yt 

您好,您可以使用pivot处理更多动态数据。有关固定年数和动态年数,请参见下面的示例。试试看

CREATE TABLE #yt 
( [id] int, [year] int,  [a] int,[b] int);
INSERT INTO #yt 
VALUES(101,2017,50,40),(102,2017,40,45),(103,2017,80,15)
     ,(104,2017,0,0),(101,2018,65,75),(102,2018,50,40)
     ,(103,2018,25,55),(104,2018,0,0)

 select *,[2017]+[2018] total from
 (select [id],[year],[a]+[b] as [total] from #yt)
 a1
 pivot
 (sum([total])
 for [year] in ([2017],[2018])
 ) piv

 DECLARE @cols AS NVARCHAR(MAX),
 @query  AS NVARCHAR(MAX)
 set  @cols = stuff((select ',' + QUOTENAME([year] ) from #yt group by 
 [year] order by [year] for xml path('')),1,1,'')

 set @query = ' select *,'+ replace(@cols,',','+') +' total from 
 (select [id],[year],[a]+[b] as [total] from #yt)
 a1
 pivot
 (sum([total]) for [year] in ('+@cols+')) piv'
 EXECUTE sp_executesql  @query 
 drop table   #yt