【问题标题】:Need a postgresql query to group and order需要一个 postgresql 查询来分组和排序
【发布时间】:2010-08-31 04:14:11
【问题描述】:

我有一个如下的客户表:

customername, ordername, amount
=============================
bob, book,     20
bob, computer, 40
steve,hat,     15
bill, book,    12
bill, computer, 3
steve, pencil, 10
bill, pen,      2

我想运行查询以获得以下结果:

customername, ordername, amount
=============================
bob,   computer, 40
bob,   book,     20
bob,   ~total~,  60
steve, hat,      15
steve, pencil, 10
steve, ~total~,25 
bill, book,    12
bill, computer, 3
bill, pen,      2 
bill, ~total~, 17

我希望从最大到最小订购每个客户的金额,并将新的订单名称命名为“~total~”(必须始终是每个客户的最后一行),结果是同一客户的所有金额的总和. 所以,在上面的例子中,bob 应该是第一个,因为总 = 60,史蒂夫第二(总 = 25)和第三个(总 = 17)。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    用途:

    SELECT x.customername,
           x.ordername,
           x.amount
      FROM (SELECT a.customername,
                   a.ordername,
                   a.amount,
                   y.rk,
                   1 AS sort
              FROM CUSTOMERS a
              JOIN (SELECT c.customername,
                           ROW_NUMBER() OVER (ORDER BY SUM(c.amount) DESC) AS rk
                      FROM CUSTOMERS c
                  GROUP BY c.customername) y ON y.customername = a.customername
            UNION ALL
            SELECT b.customername,
                   '~total~',
                   SUM(b.amount),
                   ROW_NUMBER() OVER (ORDER BY SUM(b.amount) DESC) AS rk,              
                   2 AS sort
              FROM CUSTOMERS b
          GROUP BY b.customername) x
    ORDER BY x.rk, x.customername, x.sort, x.amount DESC
    

    您可以查看使用 GROUP BY ROLLUP,但 ordername 的值为 NULL,因此您必须对其进行后处理才能将其替换为“~total~”...

    【讨论】:

    • 我喜欢“用于排序的幻影列”的想法。我正在构建一个花哨的 ORDER BY,其中涉及与 '~total~' 的比较,但你的方式更干净——即使有人下一个名为 '~total~' 的订单,它也能工作。
    • 感谢您的解决方案。但是,它仍然没有按降序对金额列进行排序。
    • 将 x.amount DESC 添加到最后一行 (ORDER BY x.customername, x.sort, x.amount DESC) 订单以降序排列。再次感谢
    • 现在要解决的最后一件事是先显示最大值。所以,第一个鲍勃,第二个史蒂夫和最后一个账单。
    • “GROUP BY ROLLUP”在 PostgreSQL 中不存在。窗口函数可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 2015-12-14
    • 2012-05-21
    • 1970-01-01
    • 2015-05-30
    相关资源
    最近更新 更多