如何在一行中按顺序对所有项目的总金额进行分组

Posted

技术标签:

【中文标题】如何在一行中按顺序对所有项目的总金额进行分组【英文标题】:How to GROUP BY total amount for all items in order in one row 【发布时间】:2021-03-05 17:08:00 【问题描述】:

我需要计算订单中所有商品的总金额,我使用了STRING_AGG(),但输出将金额分成多行。

这是 SELECT 语句:

    SELECT b.order_id as 'Order Id',
       string_agg(e.testname,CHAR(13)) as 'Test',
       string_agg(d.PRICE,CHAR(13))  as 'Price',
       string_agg(d.test_vat,CHAR(13))  as '15% Vat',
       sum(convert(float,d.TOTAL_AMOUNT)) as 'Total'
     
  FROM patients a , lab_orders b ,customers c , order_details d , labtests e  
  where a.patient_no = b.patient_no 
  and b.custid = c.custid
  and b.order_id = d.order_id 
  and d.testid = e.testid
  and b.ORDER_ID=2000000272
  
  group by   b.order_id , d.TOTAL_AMOUNT

输出:

Order Id    Test                                 Price       15% Vat        Total
2000000272  (TSH) Free T3 (FT3) Free T4 (FT4)   90 90 90    13.5 13.5 13.5  310.5
2000000272  SGPT(ALT) SGOT (AST)                40 40       6 6             92
2000000272  Patient Time (PT)                   60          9               69

为什么由于 GROUP BY 将总数分为 3 行,如何解决此问题并仅在一行中显示所有项目 310.5+92+69 = 471.5 的总数。

【问题讨论】:

作为最佳实践,我强烈建议使用现代的显式连接,而不是那些旧式的隐式连接。 【参考方案1】:

只需从group by 子句中删除总金额:

group by b.order_id --, d.total_amount

这保证了每个 order_id 仅一行,而另一方面,total_amountgroup by 子句中为每个不同的元组 (order_id, total_amount) 值插入一个新行。

旁注:

使用标准连接!老式的隐式连接是遗留语法,不应在新代码中使用

不要使用单引号作为标识符;使用方括号,或者更好的是,不需要引用的标识符

不要将数字存储为字符串

所以:

select lo.order_id
    string_agg(lt.testname, char(13))    as Test,
    string_agg(od.price, char(13))       as Price,
    string_agg(od.test_vat, char(13))    as [15% Vat],
    sum(convert(float, od.total_amount)) as Total
from patients p, 
inner join lab_orders lo    on p.patient_no = lo.patient_no 
inner join locustomers c    on lo.custid = c.custid
inner join order_details od on lo.order_id = od.order_id 
inner join labtests lt      on od.testid = lt.testid
where lo.order_id = 2000000272
group by lo.order_id

【讨论】:

在我从组中删除 d.total_amount 之前,它显示错误 d.total_amount 应该在组中,但现在它不显示错误并且工作正常谢谢:)

以上是关于如何在一行中按顺序对所有项目的总金额进行分组的主要内容,如果未能解决你的问题,请参考以下文章

我如何测试使用硒在下拉菜单中按字母顺序对项目进行排序

如何在表的一个字段中按最小值分组,保留同一行中的所有值?

如何在 Freemarker 中按特定值对列表进行分组?

如何在数据库表中按字母顺序对列进行排序? [关闭]

如何使用 SQL 数据库计算 DataGridView 中每一行的总金额

如何对数据进行分组以从选择查询中按周显示平均价格