【发布时间】: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