【问题标题】:How to group by a column without aggregate?如何按没有聚合的列分组?
【发布时间】:2021-07-05 18:56:13
【问题描述】:

我有一个表格“table1”,如下所示,其中包含有关捐赠的数据,如捐赠承诺及其付款等。这些将包括承诺、他们的承诺支付以及个人支付捐赠,如最后 3 行所示:

ID     Type            Amount     Date             ParentID       Application
-----------------------------------------------------------------------------
10     Pledge          50000      1/2/2020         50             Donation
20     Pledge          20000      5/2/2019         100            Donation
30     Payment         10000      2/1/2020         50             Pledge
40     Payment         15000      3/2/2020         50             Pledge
50     Payment         25000      4/5/2020         50             Pledge
60     Payment         10000      5/9/2019         100            Pledge
70     Payment         10000      6/8/2019         100            Pledge
80     Payment         5000       10/5/2020        200            Donation
90     Payment         9000       12/5/2019        250            Donation
100    Payment         8000       1/1/2020         230            Donation

我正在尝试按 DESC 顺序按日期排序,如下所示:

SELECT * 
FROM table1
ORDER BY 
    Date DESC, 
    CASE WHEN Type = 'Pledge' THEN 1 ELSE 0 END DESC,
    CASE WHEN Type = 'Payment' AND Application = 'Pledge' THEN 1 ELSE 0 END DESC,
    Amount

这似乎返回了预期的结果,但我还想确保所有相关事务始终彼此相邻分组。

例如,所有相关事务将始终具有相同的ParentID,如表示例中所示。我尝试在ORDER BY 子句之前添加GROUP BY ParentID,但出现“未包含在聚合函数中”的错误。

是否有任何其他方式不使用 GROUP BY 以便我能够以与我目前拥有的方式相同的方式进行 ORDER BY,但还添加逻辑以确保基于 ParentID 的所有相关事务始终分组在每个旁边其他的?

所需的结果如下所示。基本上,承诺应始终放在首位,然后按日期顺序排列相应的付款。然后,任何不相关的个​​人付款都按日期顺序排列:

    ID     Type            Amount     Date             ParentID       Application
    -----------------------------------------------------------------------------
    10     Pledge          50000      1/2/2020         50             Donation
    50     Payment         25000      4/5/2020         50             Pledge
    40     Payment         15000      3/2/2020         50             Pledge
    30     Payment         10000      2/1/2020         50             Pledge
    20     Pledge          20000      5/2/2019         100            Donation
    70     Payment         10000      6/8/2019         100            Pledge        
    60     Payment         10000      5/9/2019         100            Pledge
    80     Payment         5000       10/5/2020        200            Donation
    100    Payment         8000       1/1/2020         230            Donation
    90     Payment         9000       12/5/2019        250            Donation

【问题讨论】:

  • 你不想GROUP BY(你在另一个意义上使用这个术语,它在SQL中的含义),你只是想要ORDER BY。也许... ORDER BY parentid ASC, date DESC ...? (很难说清楚,因为你没有发布想要的结果。)
  • 这不是GROUP BY 所做的,行的顺序完全由ORDER BY 控制,如果您希望彼此相关的行彼此相邻,您需要定义一个导致该问题的ORDER BY
  • 你误会group by,你只需要先按ParentId列排序。
  • 也许您可以通过提供所需的结果来消除任何混淆
  • 你的表看起来是非规范化的:你应该有一个 Donation 表,其中有一个可以为空的外键 Pledge 表。然后你就可以通过PledgeId订购了

标签: sql sql-server tsql sql-order-by


【解决方案1】:

在您的ORDER BY 中使用parentid

...
ORDER BY parentid ASC,
         type DESC,
         date DESC
...

【讨论】:

  • 这确实允许相关的行彼此靠近,但它会抛出日期。我仍然希望日期首先按 desc 顺序排列。我已经更新了我想要的结果以反映这一点。
  • @jwalls91:更改使现有答案无效的问题被认为是粗鲁的。如果答案确实解决了您发布的问题,请接受它并针对您的新问题发布另一个问题。附带说明:如果您使用明确的日期格式,例如 YYYY-MM-DD 而不是 ??/??/YYYY,那么对于很多人来说,这会让事情变得更容易理解——月份是几月几日在那?
猜你喜欢
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多