【问题标题】:Get average per unit and filter query per year获取每单位的平均值并每年过滤查询
【发布时间】:2019-10-23 10:28:15
【问题描述】:

我需要一些代码方面的帮助,我想从下表中获取每个城市和每年的平均价格。

    Date    City    Price
 10/23/2018 Leon    1088
 2/27/2018  NewYork 1312
 4/19/2017  Texas   1303
 4/19/2017  London  1303
 4/19/2019  NewYork 1303
 2/12/2018  Leon    1251
 4/7/2017   Leon    1170
 3/20/2019  London  1650
 12/18/2017 Texas   1358
 2/18/2019  Leon    1088
 7/3/2017   NewYork 1391
 8/8/2019   Texas   830
 4/5/2018   London  1869.5
 1/29/2018  London  1169
 8/9/2019   Texas   1130

应按每个城市每年计算平均价格。 结果应按年份分组,并按每个城市显示如下:

City       Avg2017    Avg2018    Avg2019
Leon        1170      1169.5     1088
London      1303      1519.25    1650
New York    1391      1312       1303
Texas       1330.5     0         1390

感谢您的帮助。

【问题讨论】:

    标签: sql-server filter average


    【解决方案1】:

    试试动态查询

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);
    
    SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(YEAR(c.[Date])) 
            FROM YourTableName c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
    
    
    
    SET @query = 'SELECT City, ' + @cols + ' FROM 
    (
    
    SELECT City,YEAR([Date]) AS AvgYear,AVG(Price) AS Price
    FROM YourTableName
    GROUP BY City,YEAR([Date])
    
    )AS CTEs
    
     PIVOT (
              MAX(Price)
              FOR AvgYear in (' + @cols + ')
           ) p
                 '
    
    EXECUTE(@query)
    

    【讨论】:

    • 这很好,谢谢。你能解释一下它是如何工作的,并判断这是否会在未来几年实现自动化。或者需要什么才能继续显示每年 1 月 1 日至 12 月 31 日的最近 3 年数据?
    【解决方案2】:

    尝试使用带有透视逻辑的聚合:

    SELECT
        City,
        AVG(CASE WHEN CONVERT(varchar(4), Date, 120) = '2017' THEN Price END) AS Avg2017,
        AVG(CASE WHEN CONVERT(varchar(4), Date, 120) = '2018' THEN Price END) AS Avg2018,
        AVG(CASE WHEN CONVERT(varchar(4), Date, 120) = '2019' THEN Price END) AS Avg2019
    FROM yourTable
    WHERE
        CONVERT(varchar(4), Date, 120) IN ('2017', '2018', '2019')
    GROUP BY
        City;
    

    【讨论】:

    • 有没有办法让这个查询“自动化”,这样当 2020 年开始时我就不必手动添加它了?是否有可能在未来 30 年内获得尽可能多的 AVG(CASE WHEN... = 2020)?
    • 通常不会,您需要一种完全不同的方法来使用动态 SQL。你可以考虑编写一个存储过程来处理这个需求。
    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多