2012-07-24 73 views
0

我有一种情况,我必须连接两列并根据所选字段的位置对选择进行分组。这可能在SQL中。分组由SQL Server中字段名(列)的位置

我的示例代码不执行。在这里,GROUP BY 4必须组由po_noRM

SELECT Table_A.Po_no, Table_A.rmcode, SUM(Table_A.weight) as recvqty, 
    LTRIM(RTRIM(Table_A.po_no)) + LTRIM(RTRIM(MBStran.rmcode)) as po_noRM 
FROM Table_A 
GROUP BY 4 
ORDER BY Table_A.Po_no 

EDITED 所有表-A中的数据类型为varchar(20)

+0

请提供样本数据和所需的输出。 – RedFilter 2012-07-24 15:48:11

+0

你问这是因为你不想用LTRIM(...)+ LTRIM()重复表达式吗?有几种方法可以避免这种情况,但与排序不同,不要认为group by允许位置编号。 – joshp 2012-07-24 15:51:51

+0

没有joshp我无法通过po_noRM分组。所以我正在考虑按列位置分组的方式。 – rock 2012-07-24 15:55:11

回答

1

你包括在SELECT声明必须是在无论什么领域聚合函数必须在GROUP BY

SELECT Table_A.Po_no, Table_A.rmcode, SUM(Table_A.weight) as recvqty, 
    LTRIM(RTRIM(Table_A.po_no)) + LTRIM(RTRIM(MBStran.rmcode)) as po_noRM 
FROM Table_A 
GROUP BY Table_A.Po_no, Table_A.rmcode, LTRIM(RTRIM(Table_A.po_no)) + LTRIM(RTRIM(MBStran.rmcode)) 
ORDER BY Table_A.Po_no 
3

使用。如果你不喜欢重复复杂的表达式,你可以使用子查询代替:

select Table_A.Po_no, Table_A.rmcode, SUM(Table_A.weight) as recvqty, 
     po_noRM 
from (SELECT Table_A.Po_no, Table_A.rmcode, 
      LTRIM(RTRIM(Table_A.po_no)) + LTRIM(RTRIM(Table_A.rmcode)) as po_noRM 
     FROM Table_A 
    ) T 
group by po_noRM, Po_no, rmcode 
ORDER BY 1 desc 

这对性能没有影响。

我修复了查询以包含组b语句中除了总和以外的所有列。另外,在rtrim(ltrim())声明中提到了另一个表。我将它改为Table_A。

但是,我怀疑这个查询不会做你真正想要的(这是为了减少返回的行数,因为你仍然按照po_noRM的组件进行分组)。这可能更接近你想要的:

select Po_no_trim, rmcode_trim, SUM(Table_A.weight) as recvqty, 
     (po_no_trim+rmcode_trim) as po_noRM 
from (SELECT LTRIM(RTRIM(Table_A.po_no)) as po_no_trim, 
      LTRIM(RTRIM(Table_A.rmcode)) as rmcode_trim, Table_A.weight 
     FROM Table_A 
    ) T 
group by po_noRM_trim, Po_no_trim 
ORDER BY 1 desc 
+0

他们正在使用SQL服务器,所以你需要在子查询上有一个“GROUP BY”,如果没有“GROUP BY”,这将不起作用 – Taryn 2012-07-24 15:56:53

+0

为什么你需要在子查询上使用group?它没有做任何聚合。 – 2012-07-24 16:01:12

+0

@SteveHomer当答案首次发布时,它正在做一个聚合 – Taryn 2012-07-24 16:02:42