在不同的时间点多次选择单列

时间:2012-06-01 17:19:46

标签: mysql sql select

我有一个包含4列的简单表 - ID,Date,Category,Value。

我有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中运行查询。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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。

答案 2 :(得分: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)

这假设您的每个间隔只有一行。如果每个时间间隔有多行,则需要确定要为该时间间隔显示的值(最小值,最大值等)。然后你需要aggergate你的多行。如果是这种情况,OP应提供一些样本数据和预期的查询输出,以便进行测试。