3

我的桌子:

Dataid 日期 register_type read_value
77 2012-08-15 第 20 代
77 2012-08-15 太阳能 48
77 2012-08-16 第 39 代
77 2012-08-16 第 22 代
80 2012-07-11 第 11 代
80 2012-07-12 编号 23
91 2012-02-01 编号 4
91 2012-02-01 第 59 代
91 2012-02-08 第 18 代

我希望每天read_values只为 "gen"做总和register_type。我基本上希望查询返回下表:

dataid 日期 daily_value
77 2012-08-15 20.00
77 2012-08-16 61.00
80 2012-07-11 11.00
91 2012-02-01 59.00
91 2012-02-08 18.00

我尝试了以下查询,但它不起作用:

select 
    dataid, 
    date_trunc('day', timestamp_localtime) as truncated_day,
    substring(cast(date_trunc('day', timestamp_localtime) as text)
              from 1 for 10) as date,            
    sum(read_value) as daily_gen
where register_type like ‘%gen%’
from table
group by dataid, date_trunc('day', timestamp_localtime) 
order by dataid, truncated_day

我将如何编写此查询?

4

2 回答 2

5

在 Postgres 中工作:

SELECT dataid, date, sum(read_value) AS daily_value
FROM   tbl
WHERE  register_type = 'gen'
GROUP  BY 1,2
ORDER  BY 1,2

或者您的专栏名称date实际上不是日期?
如果它实际上是 a ,请在我的查询中timestamp替换为(casting the to ),它应该可以工作。(即使 Postgres 允许,你也不应该使用保留字作为标识符开头 。datedate::datetimestampdate
date

于 2013-01-17T00:03:04.323 回答
2

在 SQL Server 中,以下将起作用:

SELECT SUM(read_value) AS daily_value, dataid, date
FROM (SELECT *, CONVERT(VARCHAR(10),date,105) AS newdate FROM Table)
WHERE type = 'gen'
GROUP BY newdate

对于 MySQL,请改用:

SELECT SUM(read_value) AS daily_value, dataid, date
FROM (SELECT *, DATE_FORMAT(newdate, '%d-%m-%Y') AS day FROM Table)
WHERE type = 'gen'
GROUP BY newdate

子查询是必需的,因为GROUP BY不支持通常的聚合函数。但是,仅当date它是日期时间时才需要它。如果它只是一个日期,则无需从中提取日期

于 2013-01-16T23:11:35.723 回答