sql - 行到列 a.k.a Postgres 中的枢轴

标签 sql postgresql pivot case case-when

下面是我的选择查询

SELECT 
gtab12.AcName,  g9.TrNo::int, g9.TrDate,NetAmt,case when g9.vrid=42 then 'brin' else 'brout' end as voucher
FROM gtab09  g9
         INNER JOIN gtab10 using(TranId) 
         INNER JOIN gtab05 ON gtab10.BatchId = gtab05.BatchId 
         INNER JOIN gtab04 on gtab05.ProductId= gtab04.ProductId
         INNER JOIN gtab12 using(AcID) 
         INNER JOIN gtab07 on gtab04.PatentId= gtab07.PatentId  
WHERE    g9.BranchID = 2 
    And   g9.Vrid IN(42,43) 
    And acyrid = 2 
    AND trdate BETWEEN '2014-04-01' AND '2014-09-23' group by acname ,trno,trdate,netamt,vrid order by acname,voucher

这将返回如下所示的结果


如何将上面的结果转化为(需要在voucher column 的基础上将行转化为列)

acname         | brin_trno | brin_trdate | brin_netamt | brout_trno | brout_trdate | brout_netamt
---------------+-----------+------------+--------------+------------+--------------+-------------
KREMCOS KOLLAM |         1 |2014-04-01 |   $51,610.00  |   null     |     null     |  null               
-------------------------------------------------------------------------------------------------
KREMCOS KOLLAM |        7  |2014-04-19 |   $95,543.00  |   null     |     null     |  null               
-------------------------------------------------------------------------------------------------
KREMCOS KOLLAM |      null |null       |null           |          10|2014-05-06    |$49,894.00
-------------------------------------------------------------------------------------------------
KREMCOS KOLLAM |     null  |null       |null           |          29| 2014-08-16   |$27,894.00
-------------------------------------------------------------------------------------------------
KREMCOS KOLLAM |     null  |null       |null           |         8  |2014-04-29     |$50,894.00

最佳答案

你不需要为这个选择使用crosstab,你可以使用CASE-WHEN来锻炼它

SELECT t.acname , 
         CASE WHEN t.voucher='brin'  THEN t.trno    END AS brin_trno,
         CASE WHEN t.voucher='brin'  THEN t.trdate  END AS  brin_trdate,
         CASE WHEN t.voucher='brin'  THEN t.netamt  END AS brin_netamt,
         CASE WHEN t.voucher='brout' THEN t.trno    END AS brout_trno,
         CASE WHEN t.voucher='brout' THEN t.trdate  END AS brout_trdate,
         CASE WHEN t.voucher='brout' THEN t.netamt  END AS brout_netamt
FROM
        (
SELECT 
gtab12.AcName,  g9.TrNo::int, g9.TrDate,NetAmt,case when g9.vrid=42 then 'brin' else 'brout' end as voucher
FROM gtab09  g9
         INNER JOIN gtab10 using(TranId) 
         INNER JOIN gtab05 ON gtab10.BatchId = gtab05.BatchId 
         INNER JOIN gtab04 on gtab05.ProductId= gtab04.ProductId
         INNER JOIN gtab12 using(AcID) 
         INNER JOIN gtab07 on gtab04.PatentId= gtab07.PatentId  
WHERE    g9.BranchID = 2 
    And   g9.Vrid IN(42,43) 
    And acyrid = 2 
    AND trdate BETWEEN '2014-04-01' AND '2014-09-23' group by acname ,trno,trdate,netamt,vrid order by acname,voucher
        ) t

关于sql - 行到列 a.k.a Postgres 中的枢轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25991754/

相关文章:

sql - 是否可以使用当前行的非空单元格的数量来更新列?

php - 更改 gmdate PHP 函数的时区

ruby-on-rails - 上限部署 :cold production DB is not configured - Postgresql

node.js - 在不重置数据库的情况下在 sequelize 中添加列

mysql - 如何使用 SQL 选择特定字段的重复行,并允许存在时间差?

sql - 如何使用 LINQ 生成 SQL?

Python pandas groupby 在多列上聚合,然后旋转

python - 分组依据/透视

java - Spark 工作之间的巨大时间差距

sql - 当值基于另一列中的值时,如何将多个 SELECT 语句压缩为一个?