2011-09-12 91 views
0

我有一个名为TRNSPOINDT的表。 TRNSPOINDT有三个名为itemid,Qty,projectname的字段。我需要按itemid对这些项目进行分组,并显示相对于itemid的Qty总和。我这样做,查询是如下,如何按项目编号项目编号

SELECT ITMID ,SUM(QTY) AS QTY FROM TRNSPOINDT GROUP BY ITMID 

的问题是,我应该显示的项目名称对应到的itemid。但是,虽然IAM试图显示项目名称,但我得到了一个错误。

我已经试过此查询,

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

这样做的原因错误是,它没有任何意义的,在此查询的项目名称。例如,假设你有

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-项目名称的组合。

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 

这将显示在结果工程名,但总和将通过ITMID就像你说的有一个以上的PROJECTNAME一个ITMID来计算数量为PROJECTNAME不能及的。

如果您不希望SUM计算PROJECTNAME,但只能通过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列是没有意义的,因为它不会表示正确的信息。