Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据ID分组,并从不同表中求和(共3个表)_Sql_Sql Server_Group By_Sum_Multiple Tables - Fatal编程技术网

Sql 根据ID分组,并从不同表中求和(共3个表)

Sql 根据ID分组,并从不同表中求和(共3个表),sql,sql-server,group-by,sum,multiple-tables,Sql,Sql Server,Group By,Sum,Multiple Tables,我有三张桌子 Name - columns Custpackingslipjour(table 1) - (deliverydate, dateclosed,, salesid) Inventrans (Table 2) - (itemid, datephysical, transrefid) Salesline (Table 3) - (lineamount, itemid, salesid 我需要的是一个包含所有三个表的单表,但没有冗余信息,例如多个相同的SalesID,并且有一个总

我有三张桌子

Name - columns 
Custpackingslipjour(table 1) - (deliverydate, dateclosed,, salesid)
Inventrans (Table 2) -  (itemid, datephysical, transrefid)
Salesline (Table 3) -  (lineamount, itemid, salesid
我需要的是一个包含所有三个表的单表,但没有冗余信息,例如多个相同的SalesID,并且有一个总和(salesline.lineamount),并且我可以基于deliverydate和closed date以及datephysical对结果进行elminate,最初我有这个

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
非常感谢您的帮助,如果我不清楚我想做什么,我会跟进任何问题或意见

编辑:按照@coltech的建议,在salesid上尝试使用distinct,没有效果,但经过测试。我在前10名之后插入了distinct(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

我假设您已经尝试过选择Distinct TOP(10)…@Coltech嗯,我对Distinct的理解是,它用于基于单个列在单个表中选择唯一的条目。我试图完成的是在三个表的组合中选择salesid的所有不同条目,并对每个找到的salesid的lineamount求和。这很有效,很好,现在我该怎么做才能引入更多列,如编辑中所反映的那样?感谢您到目前为止的更正和评论。只需将额外的列添加到组中即可。在分组时,您通常不希望根据正在执行的任何操作进行分组,例如SUM、MIN、MAX、AVG等。基于此,我似乎需要创建一个子查询,以便选择不属于聚合函数一部分的列,因此我将继续此项工作,目前我会将此标记为已回答,因为我的原始问题已得到回答。谢谢你的帮助。如果你列出你想要的列和一些示例数据,我会帮你更多。