mysql到postgresql查询转换

mysql到postgresql查询转换,mysql,sql,postgresql,group-by,Mysql,Sql,Postgresql,Group By,我在MySql中有这个查询,我想知道,在postgresql中可以吗? 我想知道这是否应该是我需要改变的:) 我最关心的是不应该被忽略的分组功能 可以在岗位上执行 我愿意考虑迁徙到邮政区的可能性,我想知道。 如果当前查询我使用将做的工作 提前谢谢你的帮助, 文斯 是的,您正在使用MySQL的某些功能,这些功能在PostgreSQL上不起作用 #是非标准注释字符。在PostgreSQL中,使用--或/**/ 给定别名Region,您的选择列表中有两个不同的列,然后您尝试按该列分组,我假设这会引

我在MySql中有这个查询,我想知道,在postgresql中可以吗? 我想知道这是否应该是我需要改变的:)

我最关心的是不应该被忽略的分组功能 可以在岗位上执行

我愿意考虑迁徙到邮政区的可能性,我想知道。 如果当前查询我使用将做的工作

提前谢谢你的帮助, 文斯


是的,您正在使用MySQL的某些功能,这些功能在PostgreSQL上不起作用

  • #
    是非标准注释字符。在PostgreSQL中,使用
    --
    /**/

  • 给定别名
    Region
    ,您的选择列表中有两个不同的列,然后您尝试
    按该列分组,我假设这会引发错误,或者导致未定义的行为

  • 在子查询中,即使只有五列,也可以使用
    按1,2,3,4,5,6分组

  • 在子查询中,
    列分组是没有意义的,这些列是聚合表达式,如
    SUM()

  • 在子查询中,没有关闭
    WHERE
    子句中的括号,因此此查询也无法在MySQL中工作

  • 您的查询违反了。您在select列表中使用了几列,这些列既没有在
    GROUP BY
    子句中列出,也没有在聚合函数中列出。事实上,你为什么要在
    GROUPBY
    子句中列出你的列,这是不可理解的

    MySQL对
    groupby
    语义更为宽容。请参阅我的答案以获取解释


我想你对
groupby
的功能有一些基本的误解。要了解更多信息,我建议您阅读这篇关于SQL专家和的优秀博文。

PostgreSQL确实支持按列序号分组。@klin,谢谢您,我手头没有PG实例来测试它。据我所见,文档中提到了按
排序的列序号,但没有提到按
分组的列序号。我将把那句话删掉。但是,在OP的查询中按
SUM()
分组仍然没有意义。简单的规则是
groupby
子句中的所有列构成结果集的“逻辑”主键。结果集中的所有其他字段在功能上都依赖于它。值得注意的是,从原始海报的角度来看,这些字段都不可能是阻止使用PostgreSQL的showtopper。必须首先修复坏掉的查询。@wildplasser,谢谢,这是一种很好的思考方式。在上面测试东西非常方便
    SELECT
     #GROUP BY
   dc.region as Region
 ,(DATEDIFF(CURRENT_TIMESTAMP,cc.activated_at)) AS 'Listing Age'
 ,cc.sku AS SKU
 ,CONCAT(dc.venture_url,cc.urlkey_details) as URL
 , cc.status 'Listing Status'
# REGION
, region.name_en Region
 ,(CASE WHEN is_agent=1 THEN supplier.name ELSE concat(supplier.name, ' (private)') END) AS Agent
 # Car type
 , ct.label_en as 'Vehicle Type'
,(Case 
    WHEN cc.fk_catalog_attribute_option_global_condition=1 THEN 'New'
    ELSE 'Other' END) AS 'Condition'
, ca.name_en as Brand

FROM 
 catalog_product_visible cpv

join catalog_config cc on cc.country_id = cpv.country_id and cc.id_catalog_config = cpv.fk_catalog_config

    left join
    dwh_country dc on dc.country_id = cc.country_id

  JOIN supplier AS supplier ON supplier.country_id = cc.country_id AND supplier.id_supplier = cc.product_owner

 LEFT JOIN
 (SELECT 
 profile_isocode,
 date_format(report_date,'%x-%v') as date,
 sum(coalesce((case when event_action IN ('Email Lead Success', 'Contact Submit Sucess') OR event_category = 'Email Lead Success' then total_events end),0)) as EmailLead,
 sum(coalesce((case when event_action IN ('Phone Lead Success', 'Show number Top', 'Show number Bottom', 'Show number Agency') OR event_category IN ('Phone Lead Success') then total_events end),0)) as PhoneLead,
 sum(coalesce((case when event_category IN ('SMS Lead Success') then total_events end),0)) as SMSLead
 FROM dwh_eventlistings c
 WHERE (event_action in ('Contact Submit Sucess')
 GROUP BY 1,2,3,4,5,6)  AS leads ON leads.profile_isocode = pv.profile_isocode AND leads.listing_id = pv.listing_id AND leads.date = date_format(pv.report_date,'%x-%v')

 LEFT JOIN catalog_simple AS cs ON cs.fk_catalog_config = cc.id_catalog_config AND cs.country_id = cc.country_id

WHERE supplier.name not like '%test%' and URL not like '%test%'

GROUP BY 
country, sku, report_week, source, medium, campaign