【问题标题】:SQL GROUP BY and differences on same field (for MS Access)SQL GROUP BY 和同一字段的差异(对于 MS Access)
【发布时间】:2015-12-27 21:56:38
【问题描述】:

您好,我在 MS Access 下有以下样式的表格:(我没有制作表格,无法更改)

Date_r          |  Id_Person |Points |Position
25/05/2015    |  120       | 2000  | 1 
25/05/2015    |  230       | 1500  | 2 
25/05/2015    |  100       |  500  | 3 
21/12/2015    |  120       | 2200  | 1 
21/12/2015    |  230       | 2000  | 4 
21/12/2015    |  100       |  200  | 20

我要做的是获取按两个日期之间的点差排序的玩家列表(由 Id_Person 标识)。
例如,如果我选择 date1=25/05/2015 和 date2=21/12/2015 我会得到:
Id_Person |Points_Diff
230            | 500
120            | 200
100            |-300

我想我需要做一些类似的东西

SELECT Id_Person , MAX(Points)-MIN(Points)
FROM Table
WHERE date_r = #25/05/2015# or date_r = #21/12/2015#
GROUP BY Id_Person
ORDER BY MAX(Points)-MIN(Points) DESC

但我的问题是我真的不想按 (MAX(Points)-MIN(Points)) 排序,而是按 (date2 的点 - date1 的点) 排序,这可能会有所不同,因为点会随着时间。

【问题讨论】:

    标签: sql ms-access group-by


    【解决方案1】:

    一种方法是使用firstlast 但是,这有时会产生奇怪的结果,所以我认为条件聚合是最好的:

    SELECT Id_Person,
           (MAX(IIF(date_r = #25/05/2015#, Points, 0)) -
            MIN(IIF(date_r = #21/05/2015#, Points, 0))
           ) as PointsDiff
    FROM Table
    WHERE date_r IN (#25/05/2015#,  #21/12/2015#)
    GROUP BY Id_Person
    ORDER BY (MAX(IIF(date_r = #25/05/2015#, Points, 0)) -
              MIN(IIF(date_r = #21/05/2015#, Points, 0))
             ) DESC;
    

    因为你有两个日期,所以更容易写成:

    SELECT Id_Person,
           SUM(IIF(date_r = #25/05/2015#, Points, -Points)) as PointsDiff
    FROM Table
    WHERE date_r IN (#25/05/2015#,  #21/12/2015#)
    GROUP BY Id_Person
    ORDER BY SUM(IIF(date_r = #25/05/2015#, Points, -Points)) DESC;
    

    【讨论】:

    • 除非你永远不应该使用 dd/mm/yyyy 格式,因为当 dd 可以读取为一个月时它会失败,因此:WHERE date_r IN (#2015/05/25#, #2015/12/21#)
    • @Gustav 。 . .我同意。我只是按照 OP 呈现的方式保留格式。
    猜你喜欢
    • 1970-01-01
    • 2020-10-01
    • 2015-05-02
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    相关资源
    最近更新 更多