我有一个运行了4个月的MySQL表,我在这个表中有一个select语句,就像下面这样。
SELECT
CONCAT(
YEAR(FROM_UNIXTIME(creation_time)),
'-',
IF(
MONTH(FROM_UNIXTIME(creation_time)) < 10,
CONCAT('0', MONTH(FROM_UNIXTIME(creation_time))),
MONTH(FROM_UNIXTIME(creation_time))
)
) AS Period,
(
COUNT(CASE
WHEN system_name = 'System' THEN 1
ELSE NULL
END)
) AS "Some data",
FROM table_name
GROUP BY
Period
ORDER BY
Period DESC
最近,我增加了一个新的功能和一列,比方说是 is_rerun
. 这个值是刚刚添加的,以前不存在。现在,我想用当前的语句写一个查询,以检查 system_name
以及 is_rerun
如果该字段存在且值为1,则返回1,如果该列不存在或其值为0,则返回null。
我尝试了 IF EXISTS re_run THEN 1 ELSE NULL
但没有成功。我也可以插入以前运行的值,但我不想这样做。有什么解决办法吗。谢谢。
SELECT
CONCAT(
YEAR(FROM_UNIXTIME(creation_time)),
'-',
IF(
MONTH(FROM_UNIXTIME(creation_time)) < 10,
CONCAT('0', MONTH(FROM_UNIXTIME(creation_time))),
MONTH(FROM_UNIXTIME(creation_time))
)
) AS Period,
(
COUNT(CASE
WHEN system_name = 'System' AND IF EXISTS is_rerun THEN 1
ELSE NULL
END)
) AS "Some data",
FROM table_name
GROUP BY
Period
ORDER BY
Period DESC
作为一个初学者:你有一个 group by
查询,所以你需要把 is_rerun
在一个集合函数中。
根据你的描述,我认为类似于 case(case when is_rerun = 1 then 1 end)
应该做的工作:它返回 1
如果有 is_rerun
同行 1
,否则 null
.
或者,如果你能忍受 0
而不是 null
那么你可以使用更简单的表达方式。max(is_rerun = 1)
.
请注意,你的查询可以在很大程度上简化日期格式化逻辑和条件计数。我会将其表述为: :
select
date_format(from_unixtime(creation_time),'%Y-%m') period,
sum(system_name = 'System') some_data,
max(is_rerun = 1) is_rerun
from mytable
group by period
order by period desc