postgresql - PostgreSQL 中 MS SQL Server 的 GROUP BY ...WITH ROLLUP 的替代方案?

标签 postgresql postgresql-9.1

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 中有没有分组的替代方案?


我被分成两个查询,这有效吗?

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); 

最佳答案

如果我正确理解你的问题,你想知道如何在 PostgreSQL 中执行与 MS SQL Server 扩展 WITH ROLLUP 等效的操作,而查询的其余部分似乎是不相关的噪音。

如果是这样,according to MSDN, the WITH ROLLUP option adds 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;

具体取决于您想要做什么。这需要将内表具体化,然后扫描两次,因此效率并不高。如果您想按子集进行分组,可以通过将 GROUP BY 添加到 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等等。

顺便请阅读postgresql documentation on basic SQL syntaxlexical structure了解如何为 PostgreSQL 编写正确的 SQL。一般来说,使用 ANSI 标准样式而不是 MS SQL Server 的样式将是一个很好的起点。

#regularMetrics[Name]这样的东西在PostgreSQL中是完全无效的,它们不是有效的语法。标识符引用是用双引号完成的,例如"regularMetrics""Name"

关于postgresql - PostgreSQL 中 MS SQL Server 的 GROUP BY ...WITH ROLLUP 的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17418177/

相关文章:

sql - 根据foreign_key值更新每行中的值

postgresql - 如何将 pg_dump/pg_dumpall 与 postgres 数据库一起使用?

PostgreSQL 多值更新插入

ubuntu-12.04 - Ubuntu 12.04、PostgreSQL-9.1 - 无法访问 $libdir/postgis-2.0

postgresql - 如何在 PostgreSQL 中对字符串进行 XML 编码?

django - EC2 上的 PostgreSQL 数据库 : Connection refused

sql - 交叉应用中的分组依据

centos - 如何远程连接postgresql服务器

database - 在 PL/pgSQL 中使用变量存储查询结果

Postgresql 8.4->9.1,pg_upgrade 失败,因为数据库 'template0' 存在