我有一个具有“约会表”和“服务表”的数据库。每个appt都有一个服务,每个服务都有一个价格。我想要的是一个查询,该查询将始终返回12行(每月一行),并包含几个月的总和(基于其服务ID)。到目前为止,我有:
select sum(service_price) as monthly_total,
year(appt_date_time) as year,
monthname(appt_date_time) as month
from appt_tbl
join services_tbl on appt_tbl.service_id = services_tbl.service_id
group by month(appt_date_time),
year(appt_date_time)
order by month(appt_date_time) asc;
当前,返回的内容如下:
+---------------+------+-------+
| monthly_total | year | month |
+---------------+------+-------+
| 120.00 | 2012 | July |
+---------------+------+-------+
问题是,如果一个月没有任何订单,我不会在查询中返回该月。我希望该月有一个记录,只是它的“ monthly_total”等于零。
以下是我希望查询返回的内容:
+---------------+------+-------+
| monthly_total | year | month |
+---------------+------+-------+
| 0.00 | 2012 | Jan |
+---------------+------+-------+
| 0.00 | 2012 | Feb |
+---------------+------+-------+
| 0.00 | 2012 | March |
+---------------+------+-------+
| 0.00 | 2012 | April |
+---------------+------+-------+
| 0.00 | 2012 | May |
+---------------+------+-------+
| 0.00 | 2012 | June |
+---------------+------+-------+
| 120.00 | 2012 | July |
+---------------+------+-------+
| 0.00 | 2012 | August|
+---------------+------+-------+
| 0.00 | 2012 | Sept |
+---------------+------+-------+
| 0.00 | 2012 | Oct |
+---------------+------+-------+
| 0.00 | 2012 | Nov |
+---------------+------+-------+
| 0.00 | 2012 | Dec |
+---------------+------+-------+
有任何想法吗?
您走在正确的轨道上,只是LEFTJOIN
对月份名称表的查询结果。然后,结果中存在的名称将返回一个匹配项,并且NULL
将返回不在结果中的月份。无论您喜欢什么,aCOALESCE
或NVL
orCASE
构造都可以将其NULL
变成直线0
。
您不需要制作真实的月度表,就可以使用内联视图获取-只需生成所有月度数据的查询即可。
select months.month, coalesce(appts.monthly_total, 0) monthly_total
from (
select 'January' as month
union all select 'February'
union all select 'March'
...etc...
union all select 'December'
) months
left join (
select sum(service_price) as monthly_total,
monthname(appt_date_time) as month
from appt_tbl
inner join services_tbl
on appt_tbl.service_id = services_tbl.service_id
where appt_date_time between '2012-01-01 00:00:00'
and '2012-12-31 23:59:59'
group by month(appt_date_time)
) appts
on months.month = appts.month
至于返回特定年份的所有内容,请查看WHERE条件。我假设appt_date_time是日期时间或时间戳。您不想编写YEAR(appt_date_time)=
2012,因为这会破坏在该列上使用索引的机会(我假设该列在索引中显示为第一列)。通过使用BETWEEN …
AND并与文字日期时间进行比较,您可以拥有一个满足要求的高效查询。
另外,如果您GROUP BY
使用month(appt_date_time)
mysql,将确保结果也会按月升序排列。因此无需单独使用ORDER BY
。mysql也将保留UNION查询的“分支”顺序。
问题内容: 我有一张表,我们称它们为桌子 我需要每月的记录并更新为table ,这是我的意思是一个示例输出: 在数据类型列IS 到目前为止,这是我尝试过的: 该查询仅在每个员工和每个月显示一次。 问题答案: 尝试以下
问题内容: 不幸的是,SQL并不是很容易找到我。我有两个表,一个表和一个表。 贷款支付表: ID(主键),LoanID(与贷款表上的ID匹配),PaymentDate,Amount等。 我需要一条sql语句,该语句可以给我每个月输入的最后一笔付款(如果有的话)。我目前的说法没有给我结果。还存在一个问题,有时在该月的最大日期有时会有平局,因此我也必须能够处理该问题(我的想法是在平局的情况下选择最大的
问题内容: 我想显示现有 Orders 表中的前3条记录。为此,我需要计算每种产品的数量之和。 现有记录: 预期产量 问题答案: 然后,您需要以下摘要值:
问题内容: 您好,我正在使用此sql查询来获取基于月份的图表表示形式的最近12个月的记录: 但是,如果一个月没有任何记录,则它不会按预期包含在结果集中,并且我正在使用php进行大量计算以完成所需的操作。 我的问题是:是否有一种方法可以检索一个简单的结果集,其中包含过去12个月每个月的驱动器总数,并且如果一个月中有0个驱动器,则还必须将其包含在结果集中显示。 问题答案: 您需要使用一个表进行外部联接
问题内容: 我写了一个查询以获取用户表中的按月记录,如下所示 输出: 预期产量: 即使数据不存在,我也需要显示记录。这个怎么做? 问题答案: 关于效率,我不会说太多,因为我没有针对其他方法进行过测试,但是如果没有临时表,这似乎是一个不错的选择。 如果您基于日期格式进行并集,甚至可以减少工作量和查询负担。 两个查询的实时演示。
问题内容: 我有一张表,叫他们 我需要和每月的记录。 因为Aria和Brian每月收入只有Belle&Ziya1个,而Chloe每月收入只有2个。因此,在部门BB中,只有1即Aria,而部门CC为0,因为Chloe&Ziya。 这是我的意思是示例输出: 问题答案: 请尝试以下操作: 请在 此处 找到db <> fiddle 。