2012-07-24 54 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