如何按项目ID对项目进行分组

时间:2011-09-12 05:50:52

标签: group-by

我有一个名为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

2 个答案:

答案 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列没有意义,因为它不代表正确的信息。