我有一个名为TRNSPOINDT的表。 TRNSPOINDT有三个名为itemid,Qty,projectname的字段。我需要按itemid对项目进行分组,并显示与itemid相关的Qty总和。我这样做了,查询如下,
SELECT ITMID ,SUM(QTY) AS QTY FROM TRNSPOINDT GROUP BY ITMID
问题是,我应该显示itemid的项目名称。但是当我试图显示项目名称时,我收到了一个错误。
我试过这个查询,
SELECT ITMID ,SUM(QTY) AS QTY,PROJECTNAME FROM TRNSPOINDT GROUP BY ITMID
我收到了错误,
Column 'TRNSPOINDT.PROJECTNAME' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
我知道,我收到此错误,因为单个itemid存在多个项目名称。但我应该在itemid附近显示项目名称。怎么做..
提前致谢, Praveen.T
答案 0 :(得分:0)
此错误的原因是在此查询中包含项目名称没有意义。比如假设你有
itmid qty projectname
1 3 proj1
1 7 proj2
1 2 proj1
3 4 proj1
您需要
行itmid qty
1 12
3 4
但是如何将项目名称附加到第一个结果行?
你在问题中提到你知道原因,但它确实没有解决方案,除了按项目和项目分组,或者为项目创建一串逗号分隔的项目名称(这不是'完全“非规范化”,但也许你想要的。)
你的意思是:
SELECT ITMID, SUM(QTY) AS QTY, PROJECTNAME
FROM TRNSPOINDT
GROUP BY ITMID, PROJECTNAME
它会给出
itmid qty projectname
1 5 proj1
1 7 proj2
3 4 proj1
按所有itemid-projectname组合进行分组。
答案 1 :(得分:0)
两种方式取决于您正在寻找的“确切”。首先在group by中添加projectname列。
SELECT ITMID ,SUM(QTY) AS QTY,PROJECTNAME FROM TRNSPOINDT GROUP BY ITMID, PROJECTNAME
ITMID Sum(QTY) PROJECTNAME
-----------------------------------
itm1 10 PROJ1
itm1 20 PROJ2
itm2 12 PROJ3
这将在结果中显示projectname,但是会为ProjectNAME的Qty计算总和,而不是ITMID,因为您说一个ITMID有多个PROJECTNAME。
如果您不希望为PROJECTNAME计算Sum,只能由ITMID计算。然后你将不得不使用子查询。
SELECT B.ITMID , B.QTY, A.PROJECTNAME
FROM TRANSPOINTDT As A INNER JOIN (SELECT ITMID ,SUM(QTY) AS QTY,PROJECTNAME FROM TRNSPOINDT GROUP BY ITMID) as B
ON A.ITMID = B.ITMID
ITMID SUM(QTY) PROJECTNAME
------------------------------------
itm1 30 PROJ1
itm2 12 PROJ3
虽然添加PROJECTNAME列没有意义,因为它不代表正确的信息。