下面是我的选择查询
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/