【问题标题】:Can Unnest filtered in PostgreSQL?Unnest 可以在 PostgreSQL 中过滤吗?
【发布时间】:2023-03-29 16:53:01
【问题描述】:

我有一个表,其中“TAHUN”列按 date_part('year'::text, insert_date) 分组,而“TAHUN”列中的值 1000 为总计

我想像这样将行转置为列(但“TAHUN”列仍然是动态的,所以我不必在年初手动插入它”:

我对使用 unnest 按列“TAHUN”进行过滤感到困惑。这是我的查询:

SELECT
    unnest(array['PENDAPATAN', 'PENJUALAN 1', 'PENJUALAN 2', 'PENDAPATAN LAIN-LAIN', 'TOTAL PENDAPATAN', 'HARGA POKOK PENJUALAN (HPP)', 'PEMBELIAN', 'ONGKOS KIRIM']) AS "title",
    unnest(array["PENDAPATAN", "PENJUALAN 1", "PENJUALAN 2", "PENDAPATAN LAIN-LAIN", "TOTAL PENDAPATAN", "HARGA POKOK PENJUALAN (HPP)", "PEMBELIAN", "ONGKOS KIRIM"]) FILTER (WHERE "TAHUN" != 1000) AS "dynamic year",
    unnest(array["PENDAPATAN", "PENJUALAN 1", "PENJUALAN 2", "PENDAPATAN LAIN-LAIN", "TOTAL PENDAPATAN", "HARGA POKOK PENJUALAN (HPP)", "PEMBELIAN", "ONGKOS KIRIM"]) FILTER (WHERE "TAHUN" = 1000) AS "total"
FROM vw_blm_dashboard_hasil_usaha
GROUP BY "title", "dynamic year", "total";

unnest 可以过滤吗?或者你有什么其他方法可以解决这个问题吗?

感谢之前

【问题讨论】:

  • 与您的问题无关,但是:您应该真正避免使用那些可怕的带引号的标识符。他们的麻烦比他们的价值要多得多。 wiki.postgresql.org/wiki/…

标签: postgresql pivot crosstab unnest


【解决方案1】:

您需要将取消嵌套移动到 FROM 子句中,以便获得可以引用的列。

我个人觉得使用 VALUES 子句来写这篇文章更容易阅读:

SELECT
    x.title ,
    max(x.value) FILTER (WHERE v."TAHUN" = 2019) AS "2019",
    max(x.value) FILTER (WHERE v."TAHUN" = 2020) AS "2020",
    max(x.value) FILTER (WHERE v."TAHUN" = 2021) AS "2021",
    max(x.value) FILTER (WHERE v."TAHUN" = 1000) AS "total"
FROM vw_blm_dashboard_hasil_usaha v
 CROSS JOIN LATERAL (  
     values ("PENDAPATAN", 'PENDAPATAN'), 
            ("PENJUALAN 1", 'PENJUALAN 1'), 
            ("PENJUALAN 2", 'PENJUALAN 2'), 
            ... all other columns come here ...
 ) as x(value, title)
GROUP BY x.title;

【讨论】:

  • 非常感谢。动态年份呢?所以如果明天是2023年我就不用手动插入了。可以吗?
  • @Mr.Robot:不,那是不可能的。你必须为你想要的每一年写一个表达式。
猜你喜欢
  • 1970-01-01
  • 2016-02-26
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多