【发布时间】:2011-07-23 11:49:20
【问题描述】:
我需要显示每年和每月的“订单”总数。但是有几个月没有数据,但我确实想显示那个月(总值为零)。我可以为每年 12 条记录创建一个可帮助的“月份”,但有没有办法在不引入新表的情况下获得一系列月份?
类似:
SELECT [all year-month combinations between january 2000 and march 2011]
FROM DUAL AS years_months
有人知道如何做到这一点吗?您可以使用带有某种公式的 SELECT 来动态“创建”数据吗?!
更新:
我自己发现了这个: generate days from date range
这个问题的公认答案是我正在寻找的。也许不是最简单的方法,但它可以满足我的要求:根据公式用数据填充选择......
使用过去 10 年的所有月份动态“创建”一个表:
SELECT CONCAT(MONTHNAME(datetime), ' ' , YEAR(datetime)) AS YearMonth,
MONTH(datetime) AS Month,
YEAR(datetime) AS Year
FROM (
select (curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) MONTH) as datetime
from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
LIMIT 120
) AS t
ORDER BY datetime ASC
我必须承认,这是非常奇特的,但它确实有效......
我可以使用此选择将其与我的“订单”表连接起来,并获取每个月的总计,即使某个月份没有数据。
但使用“数字”或“日历”表可能是最好的选择,所以我将使用它。
【问题讨论】:
-
在 SQL Server 中,您可以使用递归 CTE 或交叉连接 CTE 来执行此操作。我想您可以从足够大的表中进行选择并使用用户变量。
-
你能提供更多关于你的桌子的信息吗?
-
@Jonny 基本上只有 1 个表:订单,其中包含一个日期字段。现在我需要一份从 2000 年 1 月起每个月有多少订单的清单。但有几个月,根本没有订单。但我确实希望这几个月出现在列表中。所以我需要第二张表,它包含 2000 年 1 月以来的所有月份,然后将其与订单表连接。