mysql语句转postgresql语句

需要把mysql的语句转换成postgresql的语句,如图第一语句在postgresql中无法执行,因为有聚合函数其他列就也需要聚合

img

我想着那就把聚合单独拿出来计算,所以就改造成了第二条sql的样子

img

虽然可以执行但是返回的数据有问题,正常第一条sql中执行完应该返回如下信息

img

所以以上问题出在哪里呢,如果想改造应该怎么改呢
附sql:
SELECT '2023-01-01' initialTimePoint, '2023-01-01' timePoint, count(id) result, r.appsysid FROM mysql_finger r WHERE r.create_time >= '2023-01-01' AND r.create_time < '2023-01-02' and '1' = '1'



1、经MySQL5.7测试,当一个包count聚合函数的SQL中包含表的其他列如题主中的r.appsysid时,如果r.appsysid在结果集中的所有值均为同一个值时,可以不使用GROUP BY语句也能正常执行出结果,但,这个不是标准语法,在PostGresQL中是无法执行的,修改起来也很简单,加个GROUP BY语句即可:

SELECT '2023-01-01' initialTimePoint, '2023-01-01' timePoint, count(id) result, r.appsysid
  FROM mysql_finger r
 WHERE r.create_time >= '2023-01-01' AND r.create_time < '2023-01-02' and '1' = '1'
 GROUP BY r.appsysid;

SELECT '2023-01-01' initialTimePoint, '2023-01-01' timePoint, count(id) result, r.appsysid FROM mysql_finger r WHERE r.create_time >= '2023-01-01' AND r.create_time < '2023-01-02' and '1' = '1' group by r.appsysid

题主有没有想过,没查出数据的原因是不是这个表里就没有符合这个查询条件的数据呢?


理解了,题主是想在表里没有数据的时候,使用count函数还能出现一行数据,这样其实就要用到外关联了

select * from 
(SELECT '2023-01-01' initialTimePoint, '2023-01-01' timePoint) a left join 
(SELECT count(id) result, r.appsysid 
FROM mysql_finger r WHERE r.create_time >= '2023-01-01' AND r.create_time < '2023-01-02' and '1' = '1' group by  r.appsysid) b
  • 这篇文章:mysql语句 也许能够解决你的问题,你可以看下
  • 你还可以看下sql参考手册中的 c语言-语句