【问题标题】:Group on ID, and sum from different table (3 table total)按 ID 分组,并从不同表中求和(共 3 个表)
【发布时间】:2012-03-24 14:28:10
【问题描述】:

我有三张桌子,

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 关联的项目的价值总和分组,因为这就是我所追求的。

基于此处的其他一些帖子,我尝试通过将 salesline 中的 lineamount 总和组合在 salesid 上,但运行 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

非常感谢任何帮助,如果我想做什么不清楚,我会跟进任何问题或 cmet。

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

编辑:按照 Gavins 的建议,我改为

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

那么我将不得不将这些包含在 group by 中。

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 Distinct TOP (10) ....?
  • @Coltech 好吧,我对 distinct 的理解是它用于基于单个列在单个表中选择唯一条目。我想要完成的是在三个表的组合中选择所有不同的 salesid 条目,并对每个找到的 salesid 的 lineamount 求和。

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


【解决方案1】:

我认为你很好,只是你不应该对要分组的列求和,所以只需这样做:

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

【讨论】:

  • 这很有效,很好,现在我可以做些什么来引入更多列,这反映在我的编辑中?感谢到目前为止的更正和 cmets。
  • 只需将额外的列添加到分组依据。分组时,您通常不希望按任何您正在做的 SUM、MIN、MAX、AVG 等进行分组。
  • 基于weblogs.sqlteam.com/jeffs/archive/2005/12/14/8546.aspx 看来我需要创建一个子查询以使其与选择不属于聚合函数的列一起工作,所以我不能解决这个问题,现在我会标记这个正如我原来的问题得到回答一样。感谢您的帮助。
  • 如果您列出您想要的列和一些示例数据,我会为您提供更多帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多