2016-09-06 4 views
0

私はSQL Serverデータベースでビューを持っており、このビューをPostgresqlビューに変換したいと思っています。ビューを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

あなたが得た構文エラーとは何ですか? – redneb

答えて

0
  • あなたはwhis2011.dbo.RtbActiveSitePlacesまたはwhis2011.dbo.RtbActiveSitePlaceStatisticsとしてテーブルを参照することはできません。 PostgreSQLでは、schema_name.table_nameしか使用できません。

  • ISNULL()の代わりに、coalesce()関数を使用する必要があります。それ以外の場合は、同じ形式です。

  • OUTER APPLYは、PostgreSQLには存在しません。代わりにJOIN LATERALを使用してください。しかし、あなたは普通のJOINに乗っているようです。

  • TOP (30)の代わりにORDER BY date LIMIT 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; 
+0

ありがとうございますが、そのスクリプトはMsSQLにありました。私はPostgres schema_name.table_nameで知っていて、また "OUTER APPLY "は "DATEADD"でも使えませんでした! – Nikito

+1

私はここで私が答えに入れた提案を使っています。あなたのテーブルがどのスキーマであるかわからないので、その細部を手伝ってはいけません。 – Patrick

+0

あなたの応答をありがとう、ほぼ動作しますが、エラーが発生しました: "エラー:エラー:COALESCEが整数型を整数に変換できませんでした"行合体(SUM(st.ShowsCost)、0)AS ShowsCost、 coalesce(SUM(st.ClicksCost )、0)AS ClicksCost – Nikito

関連する問題