mysql到postgresql查询转换

时间:2014-06-15 17:28:02

标签: mysql sql postgresql group-by

我在MySql中有这个查询,我想知道,在postgresql中它会没问题吗? 我想知道它是否应该是我需要改变的东西:)

我最关心的是按功能划分的群体 可以在帖子中表演。

我愿意考虑迁移到postgres的可能性,我想知道 如果我使用的当前查询将完成工作!

先谢谢你的帮助, VINC

    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

1 个答案:

答案 0 :(得分:2)

是的,您使用的是MySQL不能在PostgreSQL上运行的一些功能。

  • #是非标准评论字符supported only by MySQL。在PostgreSQL中,使用--/* */

  • 在给定别名Region的情况下,您的选择列表中有两个不同的列,然后您尝试GROUP BY该列,我假设该列会抛出错误或导致未定义行为。

  • 在子查询中,即使只有五列,也使用GROUP BY 1,2,3,4,5,6

  • 在子查询中,GROUP BY列是SUM()之类的聚合表达式是没有意义的。

  • 在您的子查询中,您不必关闭WHERE子句中的括号,因此此查询也无法在MySQL中运行。

  • 您的查询违反了the single-value rule。您可以在select-list中使用多个列,这些列不在GROUP BY子句中列出,也不在聚合函数内。事实上,为什么列出GROUP BY子句中的列是不可理解的。

    MySQL对GROUP BY语义更加宽容。请参阅我对MySQL GROUP BY behavior的回答以获得解释。

我认为你对GROUP BY的作用有一些基本的误解。要了解详情,建议您阅读SQL专家和Debunking GROUP BY myths撰写的关于author Roland Bouman的优秀博文。