簡體   English   中英

Oracle SQL按字符串聚合字段分組

[英]Oracle SQL Group By a String Aggregated Field

我在對查詢中的字段進行分組時遇到問題。 這是我正在談論的示例:

例:

AIR_DT             DOL_GAP_TIME         MATL_SIZE                     
15-JAN-15          8:00 AM              30
15-JAN-15          8:00 AM              25
15-JAN-15          9:00 AM              5
15-JAN-15          9:00 AM              10
15-JAN-15          9:00 AM              5
15-JAN-15          9:00 AM              20

那些具有相同時間的對象應歸為一,總結其matl_size

預期產量:

AIR_DT             DOL_GAP_TIME         MATL_SIZE                     
15-JAN-15          8:00 AM              55
15-JAN-15          9:00 AM              40

這是我的SQL:

SELECT 
      a.air_dt, 
      TRIM(SUBSTR(TO_CHAR (a.dol_pref_start_time, 'mm/dd/yyyy hh:mi:ss AM'),12,2))
      || ':00 '
      || TRIM(SUBSTR (TO_CHAR (a.dol_pref_start_time, 'mm/dd/yyyy hh:mi:ss    AM'),
21, 2)) dol_gap_time, e.matl_size
FROM order_implem_dtl_broadcast a, matl_mstr b, matl_size_mstr e 
WHERE a.matl_id = b.matl_id 
AND b.matl_size_id = e.matl_size_id  
AND a.air_dt LIKE '%15-JAN-15%'
GROUP BY a.air_dt, a.dol_pref_start_time, e.matl_size
ORDER BY a.air_dt, a.dol_pref_start_time;

感謝您的提前幫助!

根據您的樣本數據,這應該做您想要的:

select AIR_DT, DOL_GAP_TIME, sum(MATL_SIZE)
from table t
group by AIR_DT, DOL_GAP_TIME;

但是,我不知道這與問題中的查詢有什么關系。

好,讓我們從您的初始查詢開始:

SELECT 
  a.air_dt, 
  TRIM(SUBSTR(TO_CHAR (a.dol_pref_start_time, 'mm/dd/yyyy hh:mi:ss AM'),12,2))
  || ':00 '
  || TRIM(SUBSTR (TO_CHAR (a.dol_pref_start_time, 'mm/dd/yyyy hh:mi:ss    AM'), 21, 2)) dol_gap_time, e.matl_size
  FROM order_implem_dtl_broadcast a, matl_mstr b, matl_size_mstr e 
 WHERE a.matl_id = b.matl_id 
   AND b.matl_size_id = e.matl_size_id  
   AND a.air_dt LIKE '%15-JAN-15%'
 GROUP BY a.air_dt, a.dol_pref_start_time, e.matl_size
 ORDER BY a.air_dt, a.dol_pref_start_time;

我看到幾個問題。 一個,即使您要對SUM()進行列, e.matl_sizee.matl_size分組。 您不希望在GROUP BY 其次,您從dol_pref_start_time獲取時間的方式確實很奇怪。 看起來您想四舍五入到小時,然后獲取小時加上小時,無論是上午還是下午。 所以這:

TRIM(SUBSTR(TO_CHAR (a.dol_pref_start_time, 'mm/dd/yyyy hh:mi:ss AM'),12,2))
  || ':00 '
  || TRIM(SUBSTR (TO_CHAR (a.dol_pref_start_time, 'mm/dd/yyyy hh:mi:ss    AM'), 21, 2)) dol_gap_time

可以簡單地是這樣的:

TO_CHAR(TRUNC(a.dol_pref_start_time, 'HH'), 'HH:MI AM') AS dol_gap_time

第三,您的日期是否存儲為日期 如果是這樣,您為什么要這樣做?

AND a.air_dt LIKE '%15-JAN-15%'

這樣做會更好:

AND TRUNC(a.air_dt) = date'2015-01-15'

或者,如果您在a.air_dt上有一個索引,則:

AND a.air_dt >= date'2015-01-15'
AND a.air_dt < date'2015-01-16'

將所有這些放在一起,我們得到如下信息(請注意,我還將您的聯接轉換為ANSI SQL聯接):

SELECT TRUNC(a.air_dt) AS air_dt
     , TO_CHAR(TRUNC(a.dol_pref_start_time, 'HH'), 'HH:MI AM') AS dol_gap_time
     , SUM(e.matl_size) AS matl_size
  FROM order_implem_dtl_broadcast a INNER JOIN matl_mstr b
    ON a.matl_id = b.matl_id
 INNER JOIN matl_size_mstr e 
    ON b.matl_size_id = e.matl_size_id
 WHERE a.air_dt >= date'2015-01-15'
   AND a.air_dt < date'2015-01-16'
 GROUP BY TRUNC(a.air_dt), TO_CHAR(TRUNC(a.dol_pref_start_time, 'HH'), 'HH:MI AM')
 ORDER BY air_dt, TO_DATE(dol_gap_time, 'HH:MI AM'); -- using aliases in the ORDER BY, converting dol_gap_time to DATE for sorting

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM