我有一个包含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中运行查询。
答案 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应提供一些样本数据和预期的查询输出,以便进行测试。