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

4

3 回答 3

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)
于 2012-06-01T17:46:53.537 回答
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。

于 2012-06-01T17:47:21.903 回答
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 应该提供一些示例数据和预期的查询输出,以便可以进行测试。

于 2012-06-01T17:58:35.200 回答