SQL选择sum和group by two列

时间:2018-01-22 18:17:04

标签: sql postgresql aggregate

我正在尝试获取相同httpclient的所有音乐的列表,以获得价格的和它在同一天录制的

预期产出:

music_id

我有一张看起来像这样的音乐'

 music_id  | name | price | created          
-----------+--------------+------------------------
 1222      | blue | 333   | 2015-07-07
 2222      | red  | 45    | 2016-07-07
 1222      | blue | 111   | 2017-07-07

这是我的疑问:

 music_id  | name | price | created_at           
-----------+--------------+------------------------
 1222      | blue | 111   | 2015-07-07 22:42:39
 2222      | red  | 22.5  | 2016-07-07 22:42:39
 1222      | blue | 111   | 2017-07-07 22:42:39
 1222      | blue | 111   | 2015-07-07 11:42:39
 2222      | red  | 22.5  | 2016-07-07 11:42:39
 1222      | blue | 111   | 2015-07-07 11:42:39

但我会收到错误,

SELECT music_id, name, SUM(price), TO_DATE(cast(created_at AS text), 'YYYY-MM-DD') AS created FROM music GROUP BY music_id, created;

2 个答案:

答案 0 :(得分:1)

您的选择必须包含您的分组列。另外,如果您使用的是group by

,则可以参考postgres中的列位置
SELECT music_id, name, TO_DATE(cast(created_at AS text), 'YYYY-MM-DD') as created, SUM(price) 
FROM music 
GROUP BY 1,2,3;

答案 1 :(得分:0)

date而不是文字表示分组会更便宜:

SELECT music_id, name, SUM(price) AS created, created_at::date AS created
FROM   music
GROUP  BY 1, 2, 4;
无论如何,

'YYYY-MM-DD'是日期的默认ISO格式。在投射到to_char()之后,您仍然可以使用date 强制执行任何所需的格式:to_char(created_at::date, 'YYYY-MM-DD') - 广告投放只与GROUP BY同步您将位置参考4替换为created_at::date

在规范化的数据库模式中,您不会在此表中包含功能相关的值name,只是music_id(这将是具有所有属性的另一个表的外键)。

然后,查询将按ID和日分组,并在之后的另一个连接中从另一个表中获取更多属性...