【问题标题】:Is it possible to SUM grouped rows into another column but only show the sum result on 1 of the rows?是否可以将分组的行汇总到另一列,但只显示其中 1 行的总和结果?
【发布时间】:2019-05-04 01:37:27
【问题描述】:

我有一个查询表,其中包含来自多个使用 LEFT JOIN 连接的表的数据。到目前为止,一切正常,生成的数据是销售订单中的各个项目。我可以将总销售订单值拉到一列中,但我只希望它显示在该订单的一行中,或者显示在单独的行中以表示整个订单。

我的想法是,要么我通过总数,但以某种方式仅在该订单尚未出现时才这样做,或者我使用 SUM() 但这似乎仅在与 GROUP BY 一起使用时才有效,然后我只显示总数而不是单个项目。

我真的不知道该尝试什么,因为我什至不知道这是否可能,并且互联网搜索没有给我任何似乎有帮助的结果,它们都是关于分组的。

SELECT         
so."Sales Order#" as 'Sales Order Number',
soi."Sub Total" as 'Sub-Total'

FROM  
"Sales Order Items" AS "soi"
LEFT JOIN 
"Sales Orders" AS "so" ON so."Sales order ID"  = soi."Sales order ID" 

我想添加一个“TCV”列,它对具有相同销售订单号的所有项目的“小计”值求和。但我只希望这个小计在每个订单中显示一次(而不是针对每个订单项)。

【问题讨论】:

  • 哪个dbms??? SQL 只是一种语言。
  • 已添加示例数据表。我目前使用的软件支持用 ANSI、Oracle、SQL Server、IBM DB2、MySQL、Sybase、Informix 和 PostgreSQL SQL 方言编写的 SQL SELECT 查询。但显然建议使用 ANSI SQL 方言

标签: sql


【解决方案1】:

您可以通过在案例 stmt 中使用窗口函数轻松实现此目的:

SELECT         
    so.SalesOrderNumber as 'Sales Order Number',
    CASE WHEN LAG(so.id) OVER (PARITION BY so.salesOrderNumber ORDER BY so.id) IS NULL --this row is first in group, order however you determine "First"
        THEN soi.SubTotal
        ELSE NULL
    END AS subTotal
FROM  
    "Sales Order Items" AS soi LEFT JOIN 
    "Sales Orders" AS so ON so.salesOrderId = soi.salesOrderId 

【讨论】:

    【解决方案2】:

    用总和创建一个额外的行

    1. 复制查询
    2. 按顺序对查询进行分组
    3. 对行值列求和
    4. 使用联合将此新查询添加到原始查询。
    5. 为两者添加一个额外的列,将第一列硬编码为“行”,第二列硬编码为“订单”

    您可以添加总列

    1. 复制查询
    2. 按顺序对查询进行分组
    3. 对行值列求和
    4. 将新查询放在原始查询的 from 子句中,给它一个别名
    5. 按订单号加入查询
    6. 将新查询的 sum 列添加到第一个查询的 select 子句中
    7. 或者,您可以使用用例语句仅显示一行。

    【讨论】:

      猜你喜欢
      • 2020-09-14
      • 2018-06-18
      • 1970-01-01
      • 2019-06-07
      • 2020-11-17
      • 2013-03-10
      • 2017-09-14
      • 1970-01-01
      • 2020-09-11
      相关资源
      最近更新 更多