将视图从SQL Server转换为Postgresql?

时间:2016-09-06 10:12:15

标签: sql-server database postgresql views

我在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;

1 个答案:

答案 0 :(得分:0)

  • 您无法将表格称为whis2011.dbo.RtbActiveSitePlaceswhis2011.dbo.RtbActiveSitePlaceStatistics。在PostgreSQL中,您只能使用schema_name.table_name

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

  • PostgreSQL中不存在
  • OUTER APPLY,而是使用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;