2015-08-14 43 views
1

我正在使用Postgres 9.4。我有以下查詢:Postgres:按LIKE表達式分組?

select sum(items) as items, sum(cost) as cost, 
     presentation_code, processing_date as date 
    from vw_presentation_summary 
    where presentation_code LIKE '011%' OR presentation_code LIKE '012%' 
    GROUP BY date, presentation_code; 

這給我的結果是這樣的:

items |  cost  | presentation_code | date 
-------+------------------+-------------------+------------ 
    8243 |  273445.45 | 0212000AAAAACAC | 2014-03-01 
    366 |   10511.99 | 0212000AABBABAB | 2013-05-01 
    461 |   9232.04 | 0212000AABBADAD | 2014-02-01 

但有什麼辦法可以組所有的結果011%在一起,結果全部爲012%在一起嗎?

+0

我想我需要一個聚合函數?但不知道如何谷歌這... – Richard

回答

0

你必須用一種表達元素,如更換「presentation_code」在選擇和組:

substr(presentation_code,1,3) 
+0

謝謝 - 任何想法是否可能比這裏建議的其他方法更有效? – Richard

+0

這可能值得對它們進行基準測試 - 可能Left()比SubStr()的CPU效率略高,但很難猜測它可能以SubStr()的形式實現。對於大型數據集,與GROUP BY關聯的排序成本將佔主導地位。 –

+0

如果您對該列的前三個字符進行查詢很重要,那麼您可以嘗試在Left(presentation_code,3)上索引,然後在('011','012')中使用「where Left(presentation_code,3)」 –

0
group by left(presentation_code, 2) 
1

你可以在任何Postgres的表達組,這裏的問題是, presentation_code需要是某種類型的聚合或以可以分組的方式截斷。這裏有一個例子:

select sum(items) as items, sum(cost) as cost, 
     CASE WHEN presentation_code LIKE '011%' THEN '011' 
      WHEN presentation_code LIKE '012%' THEN '012' 
     END AS code, 
     processing_date as date 
    from vw_presentation_summary 
    where presentation_code LIKE '011%' OR presentation_code LIKE '012%' 
    GROUP BY date, code;