Sql 如何按一行中所有项目的总金额进行分组
我需要计算订单中所有项目的总金额,我使用了Sql 如何按一行中所有项目的总金额进行分组,sql,sql-server,string,inner-join,aggregate-functions,Sql,Sql Server,String,Inner Join,Aggregate Functions,我需要计算订单中所有项目的总金额,我使用了STRING\u 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',
STRING\u 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
为什么因为分组依据而将总额分成3行?如何解决此问题,并仅在一行中显示所有项目310.5+92+69=471.5的总额。只需从
分组依据
条款中删除总额:
group by b.order_id --, d.total_amount
这保证了每个order\u id
仅一行,而另一方面,groupby
子句中的total\u amount
会为tuple(order\u id,total\u amount)的每个不同值分成一个新行
旁注:
- 使用标准连接!老式的隐式联接是遗留语法,不应在新代码中使用
- 不要对标识符使用单引号;使用方括号,或者更好,使用不需要引用的标识符
- 不要将数字存储为字符串
因此:
作为一种最佳实践,我强烈建议使用现代的显式联接,而不是那些旧式的隐式联接。以前,当我通过显示错误将d.total_amount从组中删除时,d.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