2015-10-16 22 views
0

我試圖創建一個返回以下結果集的查詢中的每一天(截斷可讀性):Oracle SQL。選擇在一天的所有小時全年

+---------------+-----------+--------+--------+----------+ 
| DATE_HAPPENED | Twelve_AM | One_AM | Two_AM | Three_AM | (and so on, until 24 hours) 
+---------------+-----------+--------+--------+----------+ 
| 2015-10-01 | 110  | 34 | 92 | 45 | 
+---------------+-----------+--------+--------+----------+ 

這是我使用的代碼(而我不知道它是做)的最佳方式:

SELECT to_char(potty_use_date, 'yyyy-mm-dd HH12') as date_happened, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 AM') = '12' THEN 1 ELSE 0 END) as Twelve_AM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 AM') = '1' THEN 1 ELSE 0 END) as One_AM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 AM') = '2' THEN 1 ELSE 0 END) as Two_AM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 AM') = '3' THEN 1 ELSE 0 END) as Three_AM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 AM') = '4' THEN 1 ELSE 0 END) as Four_AM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 AM') = '5' THEN 1 ELSE 0 END) as Five_AM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 AM') = '6' THEN 1 ELSE 0 END) as Six_AM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 AM') = '7' THEN 1 ELSE 0 END) as Seven_AM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 AM') = '8' THEN 1 ELSE 0 END) as Eight_AM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 AM') = '9' THEN 1 ELSE 0 END) as Nine_AM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 AM') = '10' THEN 1 ELSE 0 END) as Ten_AM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 AM') = '11' THEN 1 ELSE 0 END) as Eleven_AM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 PM') = '1' THEN 1 ELSE 0 END) as One_PM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 PM') = '2' THEN 1 ELSE 0 END) as Two_PM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 PM') = '3' THEN 1 ELSE 0 END) as Three_PM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 PM') = '4' THEN 1 ELSE 0 END) as Four_PM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 PM') = '5' THEN 1 ELSE 0 END) as Five_PM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 PM') = '6' THEN 1 ELSE 0 END) as Six_PM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 PM') = '7' THEN 1 ELSE 0 END) as Seven_PM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 PM') = '8' THEN 1 ELSE 0 END) as Eight_PM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 PM') = '9' THEN 1 ELSE 0 END) as Nine_PM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 PM') = '10' THEN 1 ELSE 0 END) as Ten_PM, 
    COUNT(CASE WHEN to_char(potty_use_date, 'HH12 PM') = '11' THEN 1 ELSE 0 END) as Eleven_PM, 
    CASE WHEN to_char(potty_use_date, 'HH12 PM') = '12' THEN 1 ELSE 0 END) as Twelve_PM 
FROM core.potty_usage_statistics 
GROUP BY to_char(potty_use_date, 'yyyy-mm-dd HH12') 
ORDER BY date_happened ASC;   

不過,我得到以下結果:

2015-04-20 08 1197 1197 1197 1197 1197 1197 1197 1197 1197 1197 1197 1197 1197 1197 1197 1197 1197 1197 1197 1197 1197 1197 1197 1197 

他們都跨日重複e結果窗口。顯然,我沒有這樣做。我該如何做對?

+0

如果你想從你需要到位的0返回NULL聚集刪除價值進行解釋。更改您的CASE/WHEN語句。 COUNT(0)與COUNT(1)相同... – gustavodidomenico

+1

當您給出此查詢時,您會看到什麼內容? 'SELECT potty_use_date,to_char(potty_use_date,'HH12 AM')FROM core.potty_usage_statistics'我懷疑你除了一個簡單的整數之外還有其他東西, –

+1

這是一天中很多便利使用。 :s – GolezTrol

回答

2

COUNT()計算非NULL值的數量。如果值爲0或1,則全部爲非NULL。所以,計數與COUNT(*)相同。

兩個選項:

  • 更改COUNT()SUM()
  • 取出ELSE 0

就個人而言,我更喜歡第一種方法;但要麼是可行的。

我也應該注意到,您可以使用EXTRACT()用於此目的:

SUM(CASE WHEN extract(hour from potty_use_date) = 0 THEN 1 ELSE 0 END) as Midnight, 

有些人可能會覺得這更容易閱讀。

我還懷疑你想要的GROUP BYSELECT是:

SELECT to_char(potty_use_date, 'yyyy-mm-dd') as date_happened 
. . . 
GROUP BY to_char(potty_use_date, 'yyyy-mm-dd') 

如果包含小時組件,那麼你將得到一個對角值,24行的每一天,一個小時列爲每個人填充。

+0

謝謝。是的,我最終會想出最後一部分,但在週末回家之前把它關閉是件好事。這是一個幾乎完美的解釋。你能否再解釋一下'EXTRACT()'的用法? –

+0

你的'extract()'建議給了我這個錯誤:'ORA-30076:提取源的無效提取字段' –

+0

@EduardoScissaro。 。 。 'extract()'只是從日期/時間值中提取日期/時間分量。它是ANSI標準,因此它比'to_char()'更多的數據庫中可用。 –

2

也許你可以透視:

select * from 
(
    select 
    trunc(p.potty_use_date) as potty_use_date, 
    to_char(p.potty_use_date, 'HH24') as putty_use_hour, 
    from 
    core.potty_usage_statistics p 
) 
pivot (
    count(putty_use_hour) 
    for putty_use_hour in (
     '00' as "Midnight", '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', 
     '12' as "Noon", '13', '14', '15', '16', '17', '18' as "Dinner time", '19', '20', '21', '22', '23', '24' as "Or is this midnight") 
) 

我沒有手頭有甲骨文,所以我無法測試它,但這應該工作。

有關甲骨文旋轉的更多信息,以及爲什麼你需要一個小時的完整列表,請閱讀SQL Operations: Pivot and Unpivot

相關問題