【问题标题】:How to return zero values if nothing was written in time interval?如果在时间间隔内没有写入任何内容,如何返回零值?
【发布时间】:2016-09-14 13:55:38
【问题描述】:

我正在为下面的选择使用图表报告。 MySQL 数据库只有数据库中的活动记录,因此如果数据库中从 X 小时到 Y 小时没有记录,则选择不会返回任何内容。因此,就我而言,即使数据库中没有任何活动,我也需要选择返回 Paypal 零值。而且我不明白如何使用UNION 函数或重新创建选择以获取零值,如果在时间间隔内没有记录在数据库中。你能帮忙吗?

select STR_TO_DATE ( DATE_FORMAT(`acctstarttime`,'%y-%m-%d %H'),'%y-%m-%d %H') 
as '#date', count(*) as `Active Paid Accounts`  
from radacct_history where `paymentmethod` = 'PayPal' 
group by DATE_FORMAT(`#date`,'%y-%m-%d %H')

当我运行选择时,输出是:

Current Output

但是如果在 2016-07-27 07:00:00 和 2016-07-28 11:00:00 之间没有值,那么我需要每小时显示零活跃帐户像这样:

Needed output with no values every hour

我在下面创建了这样的选择,但它并没有像我需要的那样每小时都设置零值。无论如何都显示了 9 月 12 日和 9 月 13 日之间的巨大差距,但每小时应该有零值

(select STR_TO_DATE (DATE_FORMAT(acctstarttime,'%y-%m-%d %H'),'%y-%m-%d %H') 作为'#date',计数(支付方式)为Active Paid Accounts
来自 radacct_history 其中paymentmethod 'PayPal' 按 DATE_FORMAT(#date,'%y-%m-%d %H')) 分组 联合所有 (选择STR_TO_DATE (DATE_FORMAT(acctstarttime,'%y-%m-%d %H'),'%y-%m-%d %H') 作为'#date',0 作为Active Paid Accounts
来自 radacct_history 其中paymentmethod 'PayPal' 按 DATE_FORMAT(#date,'%y-%m-%d %H')) 分组;

【问题讨论】:

  • 样本数据和所需的输出将非常有助于尽快获得适当的答案。
  • 我已经在我的回答中上传了输出。谢谢

标签: mysql sql gaps-and-islands


【解决方案1】:

我猜,如果 MySQL 中没有匹配的行,你想返回 0。这是一个例子:

(SELECT Col1,Col2,Col3 FROM ExampleTable WHERE ID='1234')
 UNION (SELECT 'Def Val' AS Col1,'none' AS Col2,'' AS Col3) LIMIT 1;

更新了帖子:您正在尝试检索表中不存在的数据,我猜是参考所提供的输出。所以在这种情况下,你必须维护一个日期表来显示不在表中的日期。请参考这个,有点棘手 - SQL query that returns all dates not used in a table

【讨论】:

  • 谢谢,但该样本不返回零
  • 请检查我提供的链接。希望能帮助你理解。
【解决方案2】:

您需要一个包含所有必要时间间隔的人工表。例如。如果您需要每日数据,请创建一个表格并添加全天日期,例如从 1970 年到 2100 年。

然后您可以使用该表并 LEFT JOIN 您的 radacct_history。因此,对于每个所需的间隔,您将拥有分组项(分组依据应基于间隔表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    相关资源
    最近更新 更多