SQL Server:拆分列以按年份统计同一行中的总计

SQL Server:拆分列以按年份统计同一行中的总计,sql,tsql,split,ssms,Sql,Tsql,Split,Ssms,T-SQL问题:我有一个人每年访问的细分。我想计算一下每年的总访问量,然后为每年创建一个列来总结总访问量。按照我现在的方式,它只返回单独行中各列每年的总数。我怎样才能把它们结合起来 示例临时表和代码 CREATE TABLE #Events ( Col1 int PRIMARY KEY, Person Varchar(20), VisitYear INT, VisitInfo Varchar(20) ) IN

T-SQL问题:我有一个人每年访问的细分。我想计算一下每年的总访问量,然后为每年创建一个列来总结总访问量。按照我现在的方式,它只返回单独行中各列每年的总数。我怎样才能把它们结合起来

示例临时表和代码

CREATE TABLE #Events            
(
     Col1 int PRIMARY KEY,
     Person Varchar(20),
     VisitYear INT,
     VisitInfo Varchar(20)
)           

INSERT INTO #Events 
VALUES (1, 'User1', '2017', 'Combo'), (2, 'User1', '2017', 'Special'),
       (3, 'User1', '2018', 'ComboBig'), (4, 'User2', '2017', 'Special'),
       (5, 'User2', '2017', 'ComboBig'), (6, 'User2', '2018', 'ComboBig'),
       (7, 'User2', '2018', 'Special'), (8, 'User2', '2018', 'Special2'),
       (9, 'User3', '2018', 'Combo')            

SELECT DISTINCT 
    Person,
    VisitYear,
    VisitInfo,
    COUNT(Person) OVER(PARTITION BY Person, VisitYear) AS TtlPerYear 
INTO 
    #EventCountPerYear
FROM 
    #Events E

SELECT * 
FROM #EventCountPerYear

SELECT DISTINCT 
    E1.Person,
    CASE WHEN E1.VisitYear IN ('2017') THEN E1.TtlPerYear END AS '2017_Visits',
    CASE WHEN E1.VisitYear IN ('2018') THEN E1.TtlPerYear END AS '2018_Visits'
FROM 
    #EventCountPerYear E1
现在,结果是分开的,年份计数在不同的行上。有没有办法让它只产生一行干净的数据

下面列出的当前和预期结果的图像

目前的结果:

预期结果]


在SQL Server上,您可以使用枢轴:

个人| 2017 | 2018 :----- | ---: | ---: 用户1 | 2 | 1 用户2 | 2 | 3 用户3 | 0 | 1
dbfiddle

您正在使用条件聚合。这看起来像:

SELECT E1.Person
       SUM(CASE WHEN E1.VisitYear IN (2017) THEN E1.TtlPerYear END) AS [2017_Visits],
       SUM(CASE WHEN E1.VisitYear IN (2018) THEN E1.TtlPerYear END) AS [2018_Visits]
FROM #EventCountPerYear E1
GROUP BY E1.Person;
注:

  • 不要用单引号括起数字值,例如年份
  • 不要对列别名使用单引号。事实上,字符串和日期常量只使用单引号
  • 这将添加
    GROUP BY
    子句
请标记您的DBMS(包括版本) Person | 2017 | 2018 :----- | ---: | ---: User1 | 2 | 1 User2 | 2 | 3 User3 | 0 | 1
SELECT E1.Person
       SUM(CASE WHEN E1.VisitYear IN (2017) THEN E1.TtlPerYear END) AS [2017_Visits],
       SUM(CASE WHEN E1.VisitYear IN (2018) THEN E1.TtlPerYear END) AS [2018_Visits]
FROM #EventCountPerYear E1
GROUP BY E1.Person;