2012-06-01 20 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应提供一些样本数据和预期的查询输出,以便进行测试。