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 为什么在何处需要分组_Sql_Sql Server_Aggregate - Fatal编程技术网

Sql 为什么在何处需要分组

Sql 为什么在何处需要分组,sql,sql-server,aggregate,Sql,Sql Server,Aggregate,我不是开发人员,但需要使这项工作之前,我可以得到一个开发人员的帮助。。。 我有以下几点:;这是可行的,但是我需要一个WHERE-into-select使其正确,它告诉我需要通过添加到组中。当我这样做时,它会“复制”结果 工作原理: Select ALTEXTCUSTREF ,(SELECT AVG(C.SALESPRICE*C.QTY)) AS Budget ,select SUM(B.LEDGERSALESAMOUNT) as Labour from SMMACTIVITI

我不是开发人员,但需要使这项工作之前,我可以得到一个开发人员的帮助。。。 我有以下几点:;这是可行的,但是我需要一个WHERE-into-select使其正确,它告诉我需要通过添加到组中。当我这样做时,它会“复制”结果

工作原理:

Select  ALTEXTCUSTREF
    ,(SELECT AVG(C.SALESPRICE*C.QTY)) AS Budget
    ,select SUM(B.LEDGERSALESAMOUNT) as Labour 
from SMMACTIVITIES AS A
LEFT JOIN PROJEMPLTRANS AS B ON A.ACTIVITYNUMBER=B.ACTIVITYNUMBER
LEFT JOIN PROJFORECASTEMPL AS C ON A.ACTIVITYNUMBER=C.ACTIVITYNUMBER
WHERE A.ACTIVITYNUMBER LIKE '1234%'
group by A.ALTEXTCUSTREF, C.ACTIVITYNUMBER
但是我需要对B.LEDGERSALESAMOUNT设置一个条件,所以我做了以下操作

Select  ALTEXTCUSTREF
    ,(SELECT AVG(C.SALESPRICE*C.QTY)) AS Budget
    ,(select SUM(B.LEDGERSALESAMOUNT) where B.CATEGORYID NOT LIKE 'P_%')  as Labour 
from SMMACTIVITIES AS A
LEFT JOIN PROJEMPLTRANS AS B ON A.ACTIVITYNUMBER=B.ACTIVITYNUMBER
LEFT JOIN PROJFORECASTEMPL AS C ON A.ACTIVITYNUMBER=C.ACTIVITYNUMBER
WHERE A.ACTIVITYNUMBER LIKE '1234%'
group by A.ALTEXTCUSTREF, C.ACTIVITYNUMBER
我得到了这个错误:

Msg 8120,第16级,状态1,第4行“PROJEMPLTRANS.CATEGORYID”列 在选择列表中无效,因为它不包含在 聚合函数或GROUPBY子句

但是如果我通过将B.CATEGORYID放入组中,我会得到ALTEXTCUSTREF拆分的行,这是不正确的


请帮忙。我被卡住了,时间不多了。

编辑成OP的新意图

    SELECT bg.altextcustref
    ,bg.activitynumber
    ,bg.budget
    ,lb.labour
FROM
(
    SELECT altextcustref
        ,activitynumber
        ,AVG(c.salesprice * c.qty) AS budget
    FROM smmactivities AS a
    LEFT JOIN projforecastempl AS c 
    ON a.activitynumber = c.activitynumber
    WHERE a.activitynumber LIKE '1234%'
    GROUP BY a.altextcustref, c.activitynumber
) AS bg
INNER JOIN
(
    SELECT altextcustref
        ,activitynumber
        ,SUM(b.ledgersalesamount) AS labour
    FROM smmactivities AS a
    LEFT JOIN projempltrans AS b 
    ON a.activitynumber = b.activitynumber
    WHERE a.activitynumber LIKE '1234%'
        AND b.categoryid NOT LIKE 'P_%'
    GROUP BY a.altextcustref, c.activitynumber
) AS lb
ON bg.altextcustref = lb.altextcustref 
    AND bg.activitynumber = lb.activitynumber;

删除那些内部选择,只保留聚合函数,它们是不必要的,并从group by中删除c.ActivityNumber,,,您会显示错误,因为您的内部选择中有“where b.CategoryId不象'p_u%”,请切换到正在使用的dbms的CASE标记。(该查询是特定于产品的。)谢谢。但现在我的金额是应该的两倍。这就是我加入的方式吗?@Toold可能是因为你的
join
语句,你应该检查你的数据。尝试相同的查询,但使用
SELECT*
和delete
groupby
子句,添加
orderby a.altextcustref,c.activitynumber
要检查重复行,我会这样做,当我在SMMACTIVITIES.ACTIVITYNUMBER=C.ACTIVITYNUMBER上将JOIN PROJFORECASTEMPL添加为C时,值会加倍。我已经尝试过其他每一次加入,但都没有什么不同。如果有人没有任何线索?@Toold,这意味着您应该分别计算
预算
人工
(使用左JOIN projforecastempl表示
预算
,projempltrans表示
人工
),然后在
a.altextcustref,c.activitynumber
上合并两个结果。试着用我编辑过的答案。