2012-06-01 19 views
0

我有一個簡單的表,包含4列 - ID,日期,類別,值。在不同的時間點多次選擇單個列

我有5個不同的類別每天都有一定的價值。我想在不同的時間點選擇價值欄,並顯示結果以及相應的類別。

這是我使用的代碼:

select 
Category, 
case when date=DATE_SUB(CURDATE(),INTERVAL 1 DAY) then value else 0 end as Today, 
case when date=DATE_SUB(CURDATE(),INTERVAL 1 MONTH) then value else 0 end as "Month Ago", 
case when date=DATE_SUB(CURDATE(),INTERVAL 1 Year) then value else 0 end as "Year Ago" 
from table 
group by category 

它不工作。我正在使用mysql數據庫,但會通過ODBC連接在SSRS中運行查詢。

+1

什麼是錯誤? – JHS

+0

它不工作不是一個有效的錯誤信息! – markus

+0

@ markus-tharkun:想象一下,如果有多少問題提問者會很高興。 –

回答

0

這種類型的查詢,最好有三個單獨的查詢做:

SELECT 'Today' AS `When`, Category, value FROM `table` 
    WHERE date = DATE_SUB(CURDATE(),INTERVAL 1 DAY) 
UNION ALL 
SELECT 'Month Ago' AS `When`, Category, value FROM `table` 
    WHERE date = DATE_SUB(CURDATE(),INTERVAL 1 MONTH) 
UNION ALL 
SELECT 'Year Ago' AS `When`, Category, value FROM `table` 
    WHERE date = DATE_SUB(CURDATE(),INTERVAL 1 YEAR) 
0

與您的查詢的問題在於,作爲寫的,case語句需要嵌入聚合函數:

select Category, 
     avg(case when date=DATE_SUB(CURDATE(),INTERVAL 1 DAY) then value end) as Today, 
     avg(case when date=DATE_SUB(CURDATE(),INTERVAL 1 MONTH) then value end) as "Month Ago", 
     avg(case when date=DATE_SUB(CURDATE(),INTERVAL 1 Year) then value end) as "Year Ago" 
from table 
group by category 

我選擇了「avg」,因爲如果有多個值並且「value」列是數字,這似乎是合理的。您可能更喜歡min()或max()來獲取其他值。

此外,我刪除了「else 0」子句,因此,如果沒有值,您將看到NULL而不是0。

0

嘗試這樣:

SELECT 
    t1.Category, t1.Value, t2.Value, t3.Value 
    FROM YourTable t1 
    LEFT OUTER JOIN YourTable t2 ON t1.Category=t2.Category 
            AND Date=DATE_SUB(CURDATE(),INTERVAL 1 Month) 
    LEFT OUTER JOIN YourTable t3 ON t1.Category=t3.Category 
            AND Date=DATE_SUB(CURDATE(),INTERVAL 1 Year) 
    WHERE Date=DATE_SUB(CURDATE(),INTERVAL 1 DAY) 

這個假定您已經按照您的間隔只有一排。如果每個區間有多行,則需要決定要在該區間顯示哪個值(最小值,最大值等)。那麼你需要加強你的多行。如果是這種情況,OP應提供一些樣本數據和預期的查詢輸出,以便進行測試。