簡體   English   中英

如何獲得一個月中每天的價值

[英]How to get values for every day in a month

數據:

values date
14 1.1.2010
20 1.1.2010
10 2.1.2010
7  4.1.2010
...

關於2010年1月的樣本查詢應該得到31行。 每天一個。 值得加入。 現在我可以用31個查詢做到這一點,但我希望這可以用一個。 可能嗎?

結果:

1. 34
2. 10
3.  0
4.  7
...

這在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

最好使用表來存儲這些值並改為與它連接。

結果:

1, 34
2, 10
3, 0
4, 7

鑒於有些日期你沒有數據,你需要填補空白。 一種方法是讓日歷表預先填入您需要的所有日期,然后加入。 如果您希望結果顯示在問題中顯示的日期數字,您可以在日歷中預先填充這些數字作為標簽。

您可以將數據表日期字段連接到日歷表的日期字段,按該字段分組和總和值。 您可能希望為所涵蓋的日期范圍指定限制。

所以你可能有:

CREATE TABLE Calendar (
    label varchar,
    cal_date date,
    primary key ( cal_date )
)

查詢:

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

更新

我看到你有約會時間而不是約會。 你可以在連接中使用MySQL DATE()函數,但這可能不是最佳的。 另一種方法是在Calendar表中定義每天的“時間桶”的開始和結束時間。

要使用SQL動態獲取日期范圍內的日期,您可以執行此操作(例如在mysql中):

創建一個表來保存數字0到9。

CREATE TABLE ints ( i tinyint(4) );

insert into ints (i)
values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);

運行如下查詢:

select ((curdate() - interval 2 year) + interval (t.i * 100 + u.i * 10 + v.i) day) AS Date
from
    ints t
    join ints u
    join ints v
having Date between '2015-01-01' and '2015-05-01'
order by t.i, u.i, v.i

這將生成2015年1月1日至2015年5月1日之間的所有日期。

Output
2015-01-01
2015-01-02
2015-01-03
2015-01-04
2015-01-05
2015-01-06
...
2015-05-01

該查詢將表連接3次並獲得遞增的數字(0到999)。 然后它將此數字作為從特定日期開始的日間隔添加,在這種情況下是2年前的日期。 使用上面的示例可以獲得從2年前到1000天的任何日期范圍。 要生成生成日期超過1,000天的查詢,只需再次加入ints表以允許最多10,000天的范圍,依此類推。

這對我有用......它是我在另一個網站上找到的查詢的修改。 “INTERVAL 1 MONTH”子句確保我獲得當前月份數據,包括沒有命中數天的零。 將其更改為“INTERVAL 2 MONTH”以獲取上個月的數據等。

我有一個名為“payload”的表,其中包含一個“timestamp”列 - 然后我將時間戳列加到動態生成的日期,然后將其轉換為日期在ON子句中匹配。


SELECT `calendarday`,COUNT(P.`timestamp`) AS `cnt` FROM 
(SELECT @tmpdate := DATE_ADD(@tmpdate, INTERVAL 1 DAY) `calendarday`
    FROM (SELECT @tmpdate := 
        LAST_DAY(DATE_SUB(CURDATE(),INTERVAL 1 MONTH))) 
        AS `dynamic`, `payload`) AS `calendar`
LEFT JOIN `payload` P ON DATE(P.`timestamp`) = `calendarday`
GROUP BY `calendarday`

如果我正確理解這個相當含糊的問題,你想知道一個月內每個日期的記錄數。 如果這是真的,那么你可以這樣做:

SELECT COUNT(value_column) FROM table WHERE date_column LIKE '2010-01-%' GROUP BY date_column

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM