【问题标题】:Convert a view from SQL Server to Postgresql?将视图从 SQL Server 转换为 Postgresql?
【发布时间】:2017-01-13 18:09:57
【问题描述】:

我在 SQL Server 数据库中有一个视图,我想将此视图转换为 Postgresql 视图,我尝试了多次,但每次都出现语法错误。

请你看看我的sql并帮我转换一下好吗?

CREATE VIEW dbo.View_RtbActiveSitePlacesCtrWeekly
AS
   SELECT      
       Id, 
       CASE WHEN Shows > 0 THEN CASE WHEN Clicks > 0 THEN Clicks ELSE 1 END / CAST(Shows AS float) * 100 ELSE 0 END AS CTR, 
       ShowsCost / 1000 / CASE WHEN Clicks > 0 THEN Clicks ELSE 1 END AS AvClickCost, CASE WHEN Shows > 0 THEN ShowsCost / Shows ELSE 0 END AS AvCpm, 
       CASE WHEN Clicks > 0 THEN 0 ELSE 1 END AS IsCtrPredicted, ClicksCost - ShowsCost / 1000 AS Balance
    FROM         
        (SELECT     
             p.Id, 
             ISNULL(SUM(st.ClicksCount), 0) AS Clicks, 
             ISNULL(SUM(st.ShowsCount), 0) AS Shows, 
             ISNULL(SUM(st.ShowsCost), 0) AS ShowsCost, 
             ISNULL(SUM(st.ClicksCost), 0) AS ClicksCost
         FROM          
             whis2011.dbo.RtbActiveSitePlaces AS p 
         OUTER APPLY
             (SELECT TOP (30) 
                  RtbActiveSitePlaceId pId, Date, ShowsCount, ShowsCost, 
                  ClicksCount, ClicksCost
              FROM          
                  whis2011.dbo.RtbActiveSitePlaceStatistics
              WHERE      
                  RtbActiveSitePlaceId = p.Id 
                  AND Date >= '2016-05-01 00:00:00.000' 
                  AND (ShowsCount > 0 OR ClicksCount > 0)
              ORDER BY 
                  Date DESC) AS st
         WHERE      
             p.LastAccess >= DATEADD(dd, - 1, GETDATE())
         GROUP BY p.Id) t;

【问题讨论】:

  • 你遇到了什么语法错误?

标签: sql-server database postgresql views


【解决方案1】:
  • 您不能将表称为whis2011.dbo.RtbActiveSitePlaceswhis2011.dbo.RtbActiveSitePlaceStatistics。在 PostgreSQL 中你只能使用schema_name.table_name

  • 您应该使用coalesce() 函数而不是ISNULL(),否则格式相同。

  • OUTER APPLY 在 PostgreSQL 中不存在,请改用JOIN LATERAL。但看起来你可以通过普通的JOIN 获得。

  • 使用ORDER BY date LIMIT 30 而不是TOP (30)

  • 而不是DATEADD(...)CURRENT_DATE - 1

总的来说,你应该得到这样的结果:

CREATE VIEW dbo.View_RtbActiveSitePlacesCtrWeekly AS
    SELECT Id, 
        CASE WHEN Shows > 0
             THEN CASE WHEN Clicks > 0 THEN Clicks ELSE 1 END / Shows::float * 100
             ELSE 0 END AS CTR, 
        ShowsCost / 1000 / CASE WHEN Clicks > 0 THEN Clicks ELSE 1 END AS AvClickCost,
        CASE WHEN Shows > 0 THEN ShowsCost / Shows ELSE 0 END AS AvCpm, 
        NOT (Clicks > 0) AS IsCtrPredicted,
        ClicksCost - ShowsCost / 1000 AS Balance
    FROM (      
        SELECT p.Id, 
               coalesce(SUM(st.ClicksCount), 0) AS Clicks, 
               coalesce(SUM(st.ShowsCount), 0) AS Shows, 
               coalesce(SUM(st.ShowsCost), 0::money) AS ShowsCost, 
               coalesce(SUM(st.ClicksCost), 0::money) AS ClicksCost
        FROM whis2011.RtbActiveSitePlaces AS p 
        JOIN (
            SELECT RtbActiveSitePlaceId pId, Date, ShowsCount, ShowsCost, 
                   ClicksCount, ClicksCost
            FROM whis2011.RtbActiveSitePlaceStatistics
            WHERE Date >= '2016-05-01'::date 
              AND (ShowsCount > 0 OR ClicksCount > 0)
            ORDER BY Date DESC LIMIT 30) AS st ON st.RtbActiveSitePlaceId = p.Id
        WHERE p.LastAccess >= CURRENT_DATE - 1
        GROUP BY p.Id) t;

【讨论】:

  • 谢谢,但该脚本在 MsSQL 中,我知道在 Postgres schema_name.table_name 中,并且“OUTER APPLY”也不起作用“DATEADD”!
  • 好的,所以请使用我在此处回答的建议。我不知道您的表在什么架构中,所以我无法为您提供详细信息。
  • 感谢您的回复,几乎可以工作,但我收到错误“错误:错误:COALESCE 无法将类型整数转换为货币”行 coalesce(SUM(st.ShowsCost), 0) AS ShowsCost, coalesce (SUM(st.ClicksCost), 0) AS ClicksCost
  • 非常感谢;最后一个问题是如何将钱转换为整数或浮点数?因为我收到另一个错误:错误:CASE/WHEN 无法将类型货币转换为整数第 6 行:CASE WHEN Shows > 0 THEN ShowsCost / Shows ELSE 0 EN...
  • money 类型并不适合除法和乘法。您最好的选择是将其转换为numeric,因为它具有与money 相同的固定精度。完成所有计算后,您可以将结果转换回money
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 2014-11-25
  • 2020-03-06
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多