sql - 根据 ID 进行分组,以及来自不同表的总和(总共 3 个表)

标签 sql sql-server group-by sum multiple-tables

我有三张 table ,

Name - columns 
Custpackingslipjour(table 1) - (deliverydate, dateclosed,, salesid)
Inventrans (Table 2) -  (itemid, datephysical, transrefid)
Salesline (Table 3) -  (lineamount, itemid, salesid

我需要的是一个包含所有三个表的单个表,但没有冗余信息,例如多个相同的 salesid,并且具有总和(salesline.lineamount),并且我可以根据交货日期和关闭日期消除结果,与 datephysical 一起,最初我有这个。

SELECT     TOP (10) dbo.AX_CUSTPACKINGSLIPJOUR.DELIVERYDATE,
dbo.AX_SALESLINE.LINEAMOUNT, dbo.AX_INVENTTRANS.DATEPHYSICAL, 
dbo.AX_INVENTTRANS.COSTAMOUNTPOSTED, dbo.AX_INVENTTRANS.ITEMID, 
dbo.AX_INVENTTRANS.TRANSREFID, dbo.AX_CUSTPACKINGSLIPJOUR.SALESID
FROM         dbo.AX_CUSTPACKINGSLIPJOUR
     INNER JOIN
dbo.AX_SALESLINE ON dbo.AX_CUSTPACKINGSLIPJOUR.SALESID = dbo.AX_SALESLINE.SALESID 
     INNER JOIN
     dbo.AX_INVENTTRANS ON dbo.AX_SALESLINE.ITEMID = dbo.AX_INVENTTRANS.ITEMID

但由于 salesid 和 itemid 之间固有的一对多关系,它会生成一个包含许多相同行的表。

所以我想我应该将与每个 salesid 相关的商品的值(value)总和分组,因为这就是我所追求的。

根据这里的其他一些帖子,我尝试通过在 salesid 上分组来组合 salesline 的 lineamount 总和,但运行 5 分钟后,它似乎不是一个好的解决方案,我认为我有权利想法,但我做错了。

select top 10 s.SALESID,
    SUM(sp.LINEAMOUNT) as 'TotalLineamount'
from AX_CUSTPACKINGSLIPJOUR as s
right outer join AX_SALESLINE as sp on s.SALESID=sp.SALESID 
left outer join AX_INVENTTRANS as p on sp.ITEMID=p.ITEMID
where s.SALESID is not null
group by s.SALESID,sp.LINEAMOUNT

非常感谢任何帮助,如果我想做的事情不清楚,我会跟进任何问题或评论。

编辑:遵循@coltech的建议并尝试在salesid上使用distinct,但没有成功,但已经过测试。我在前 10 名之后插入了 unique(salesid)

编辑:根据加文斯的建议,我更改为

select top 10 cp.SALESID,
SUM(sl.LINEAMOUNT) as 'TotalLineamount'
from AX_CUSTPACKINGSLIPJOUR as cp
right outer join AX_SALESLINE as sl on cp.SALESID=sl.SALESID 
left outer join AX_INVENTTRANS as it on sl.ITEMID=it.ITEMID
where cp.SALESID is not null
group by cp.SALESID

我还更改了表的前缀以更好地匹配表名称。但是,例如,如果我想包含更多列,则这是可行的。 sl.LINEAMOUNT、it.DATEPHYSICAL、it.COSTAMOUNTPOSTED、it.ITEMID、it.TRANSREFID 和 cp.SALESID

然后我必须将它们包含在分组依据中。

select top 10 cp.SALESID,
SUM(sl.LINEAMOUNT) as 'TotalLineamount',
cp.DELIVERYDATE,
sl.LINEAMOUNT, it.DATEPHYSICAL, 
it.COSTAMOUNTPOSTED, it.ITEMID, 
it.TRANSREFID, cp.SALESID
from AX_CUSTPACKINGSLIPJOUR as cp
right outer join AX_SALESLINE as sl on cp.SALESID=sl.SALESID 
left outer join AX_INVENTTRANS as it on sl.ITEMID=it.ITEMID
where cp.SALESID is not null
group by cp.SALESID, cp.DELIVERYDATE,sl.LINEAMOUNT, it.DATEPHYSICAL, it.COSTAMOUNTPOSTED, it.ITEMID, it.transrefid

但是,这似乎导致查询运行很长时间,运行了接近 25 分钟。有没有办法加快这个速度?或者我只是错误地解决了这个问题?

最佳答案

我认为你没问题,只是你不应该对你想要分组的列进行求和,所以只需这样做:

select top 10 s.SALESID,
    SUM(sp.LINEAMOUNT) as 'TotalLineamount'
from AX_CUSTPACKINGSLIPJOUR as s
right outer join AX_SALESLINE as sp on s.SALESID=sp.SALESID 
left outer join AX_INVENTTRANS as p on sp.ITEMID=p.ITEMID
where s.SALESID is not null
group by s.SALESID

关于sql - 根据 ID 进行分组,以及来自不同表的总和(总共 3 个表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9852508/

相关文章:

MySQL如何查找表中的空数据

.net - 在 SQL Server 中,SESSIONPROPERTY 和 @@Options 之间有什么区别?

mysql - 使用 group by 时显示与 group by 匹配相关的所有行数据

sql-server - 给定 Azure 中 SQL 数据库上的 SQL 查询的查询 ID,是否有办法返回并跟踪谁发起了查询?

scala - 嵌套数据中深叶上的 FP 或类型级别工具 groupBy?

MySQL 选择每个运动员的最佳(和最老)表现、类别

SQL 组结果作为列数组

java - 如何使用pair返回jooq更新查询中的多列

mysql - Sql 查询获取与标志关联的产品

sql-server - 困惑: Why SSMS creates a default clustered index for a primary key with an identity