2
SELECT Category ,CASE WHEN GROUPING([Category]) = 0 THEN [Category] 
        ELSE 'Total Shown' END AS [Category]
    ,SUM([Impressions]) AS [Impressions]
    ,SUM([Clicks]) AS [Clicks]
    ,CASE WHEN SUM([Impressions]) = 0 THEN NULL ELSE SUM([Clicks]) / (SUM([Impressions]) * 1.0) END AS [CTR]
    ,CASE WHEN SUM([Clicks]) = 0 THEN NULL ELSE SUM([Cost]) / (SUM([Clicks]) * 1.0) END AS [CPClick]
    ,SUM([Cost]) AS [Spend]
    ,SUM([Transactions]) AS [Transactions]
    ,SUM([Conversions]) AS [Conversions]
    ,CASE WHEN SUM([Clicks]) = 0 THEN NULL ELSE SUM([Transactions]) / (SUM([Clicks]) * 1.0) END AS [Trans Rate]
    ,CASE WHEN SUM([Clicks]) = 0 THEN NULL ELSE SUM([Actions]) / (SUM([Clicks]) * 1.0) END AS [Action Rate]
    ,SUM([Actions]) AS [Actions]
    ,Grouping( Category ) as TotalShown

INTO #regularMetrics FROM #tmp
GROUP BY Category WITH ROLLUP 
ORDER BY TotalShown,[Impressions] desc, [Category]

postgresqlでグループ化の代替手段はありますか??


私は2つのクエリに分割されていますが、効率的ですか?

SELECT [Category ] , SUM([Impressions]) AS [Impressions] ,SUM([Clicks]) AS [Clicks] ,CASE WHEN SUM([Impressions]) = 0 THEN NULL ELSE SUM([Clicks]) /
  (SUM([Impressions]) * 1.0) END AS [CTR] ,CASE WHEN SUM([Clicks]) = 0 THEN NULL ELSE SUM([Cost]) / (SUM([Clicks]) * 1.0) END AS [CPClick] ,SUM([Cost]) AS [Spend]  
  ,SUM([Transactions]) AS [Transactions]  ,SUM([Conversions]) AS [Conversions]  ,CASE WHEN SUM([Clicks]) = 0 THEN NULL ELSE SUM([Transactions]) / (SUM([Clicks]) * 1.0) 
  END AS "Trans Rate"  ,CASE WHEN SUM([Clicks]) = 0 THEN NULL ELSE SUM([Actions]) / (SUM([Clicks]) * 1.0) END AS "Action Rate"  ,SUM([Actions]) AS [Actions]  , 0 as TotalShown  
  INTO #regularMetrics  FROM #tmp GROUP BY Category   ORDER BY Category ,[Impressions] desc;

 insert into #regularmetrics(select 'Total Shown', sum(impressions), sum(clicks), CASE WHEN SUM([Impressions]) = 0 THEN NULL ELSE SUM([Clicks]) / (SUM([Impressions]) * 1.0) END AS [CTR], CASE WHEN SUM([Clicks]) = 0 THEN NULL ELSE SUM([spend]) / (SUM([Clicks]) * 1.0) END AS [CPClick], sum(spend),sum(transactions),sum(conversions), CASE WHEN SUM([Clicks]) = 0 THEN NULL ELSE SUM([Transactions]) / (SUM([Clicks]) * 1.0) END AS "Trans Rate"  ,CASE WHEN SUM([Clicks]) = 0 THEN NULL ELSE SUM([Actions]) / (SUM([Clicks]) * 1.0) END AS "Action Rate", sum(actions), 1 from #regularmetrics); 
4

1 に答える 1

2

私があなたの質問を正しく理解していればWITH ROLLUP、PostgreSQL で MS SQL Server 拡張機能に相当するものを実行する方法を知りたがっていますが、残りのクエリは無関係なノイズのようです。

その場合、MSDN によると、このWITH ROLLUPオプションは subtotals を追加します。残念ながら、これは PostgreSQL が現在サポートしているものではありません。

PostgreSQL での回避策は、次のように記述することです。

WITH my_real_query AS (
    SELECT a, b
    FROM ...
    -- blah blah
)
SELECT 'line', a, b FROM my_real_query
UNION ALL
SELECT 'sum', sum(a), sum(b) FROM my_real_query;

正確に何をしたいかによって異なります。これには、内部テーブルを具体化してから 2 回スキャンする必要があるため、それほど効率的ではありません。サブセットでグループ化したい場合は、次のようにクエリGROUP BYの 2 番目のアームに a を追加することで実行できます。UNION ALL

WITH my_real_query AS (
    SELECT a, b
    FROM ...
    -- blah blah
)
SELECT a, b FROM my_real_query
UNION ALL
SELECT a, sum(b) FROM my_real_query GROUP BY a;

部分についてはINSERT... 通常、SQL標準のINSERT INTO ... SELECT構文を使用する必要があります。上記をテーブルに挿入したいとします。あなたは書くでしょう:

INSERT INTO some_table(col1,col2)
WITH my_real_query AS (
    SELECT a, b
    FROM ...
    -- blah blah
)
SELECT a, b FROM my_real_query
UNION ALL
SELECT a, sum(b) FROM my_real_query GROUP BY a;

ご覧のとおり、実際INSERT INTO ... [QUERY][QUERY]できる場所WITH ... SELECTなどもあります。

ところで、基本的な SQL 構文 と字句構造に関する postgresql のドキュメントを読んで、 PostgreSQL の正しい SQL の書き方を学んでください。一般に、MS SQL Server のスタイルの代わりに ANSI 標準スタイルを使用することは、出発点として適しています。

#regularMetricsやのようなもの[Name]は PostgreSQL では完全に無効であり、有効な構文ではありません。識別子の引用は、二重引用符で"regularMetrics"行い"Name"ます。

于 2013-07-02T06:31:58.207 に答える