如何获得一个月中每天的价值

iva*_*var 6 mysql

数据:

values date
14 1.1.2010
20 1.1.2010
10 2.1.2010
7  4.1.2010
...
Run Code Online (Sandbox Code Playgroud)

关于2010年1月的样本查询应该得到31行.每天一个.值得加入.现在我可以用31个查询做到这一点,但我希望这可以用一个.可能吗?

结果:

1. 34
2. 10
3.  0
4.  7
...
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 11

这在SQL中实际上非常难以实现.一种方法是使用UNION ALLs的长选择语句来生成从1到31的数字.这说明了原理,但为了清楚起见我在4处停止:

SELECT MonthDate.Date, COALESCE(SUM(`values`), 0) AS Total
FROM (
    SELECT 1 AS Date UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    --
    SELECT 28 UNION ALL
    SELECT 29 UNION ALL
    SELECT 30 UNION ALL
    SELECT 31) AS MonthDate
LEFT JOIN Table1 AS T1
ON MonthDate.Date = DAY(T1.Date)
AND MONTH(T1.Date) = 1 AND YEAR(T1.Date) = 2010
WHERE MonthDate.Date <= DAY(LAST_DAY('2010-01-01'))
GROUP BY MonthDate.Date
Run Code Online (Sandbox Code Playgroud)

最好使用表来存储这些值并改为与它连接.

结果:

1, 34
2, 10
3, 0
4, 7
Run Code Online (Sandbox Code Playgroud)


mar*_*ton 5

鉴于有些日期你没有数据,你需要填补空白.一种方法是让日历表预先填入您需要的所有日期,然后加入.如果您希望结果显示在问题中显示的日期数字,您可以在日历中预先填充这些数字作为标签.

您可以将数据表日期字段连接到日历表的日期字段,按该字段分组和总和值.您可能希望为所涵盖的日期范围指定限制.

所以你可能有:

CREATE TABLE Calendar (
    label varchar,
    cal_date date,
    primary key ( cal_date )
)
Run Code Online (Sandbox Code Playgroud)

查询:

SELECT
    c.label,
    SUM( d.values )
FROM
    Calendar c
JOIN
    Data_table d
ON  d.date_field = c.cal_date
WHERE
    c.cal_date BETWEEN '2010-01-01' AND '2010-01-31'
GROUP BY
    d.date_field
ORDER BY
    d.date_field
Run Code Online (Sandbox Code Playgroud)

更新:

我看到你有约会时间而不是约会.你可以在连接中使用MySQL DATE()函数,但这可能不是最佳的.另一种方法是在Calendar表中定义每天的"时间桶"的开始和结束时间.