相关疑难解决方法(0)

在 PostgreSQL 中进行数据透视

我正在尝试找到一种在 Postgres 中进行数据透视的方法,但我可以 \xe2\x80\x99t 使用它,我正在尝试寻找另一种方法。我发现以下网站解释了 SQL Server 中的数据透视表,示例之一正是我想要做的。http://sqlhints.com/2014/03/10/pivot-and-unpivot-in-sql-server/

\n\n

例子是:

\n\n
CREATE TABLE CourseSales(Course VARCHAR(50),Year INT,Earning  MONEY);\n\nINSERT INTO CourseSales VALUES(\'.NET\',2012,10000);\nINSERT INTO CourseSales VALUES(\'Java\',2012,20000);\nINSERT INTO CourseSales VALUES(\'.NET\',2012,5000);\nINSERT INTO CourseSales VALUES(\'.NET\',2013,48000);\nINSERT INTO CourseSales VALUES(\'Java\',2013,30000);\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用数据透视函数,查询如下:

\n\n
SELECT *FROM CourseSales\nPIVOT(SUM(Earning)       \nFOR Course IN ([.NET], Java)) AS PVTTable;\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想在 postgresql 中做同样的事情,但是使用像上面这样的动态方式。

\n

sql sql-server postgresql pivot

2
推荐指数
1
解决办法
4124
查看次数

具有多个“行名称”列的 Postgresql 交叉表查询

我有一张“瘦高”事实表:

CREATE TABLE facts(
    eff_date timestamp NOT NULL,
    update_date timestamp NOT NULL,
    symbol_id int4 NOT NULL,
    data_type_id int4 NOT NULL,
    source_id char(3) NOT NULL,
    fact decimal
 /* Keys */
  CONSTRAINT fact_pk
    PRIMARY KEY (source_id, symbol_id, data_type_id, eff_date),
)
Run Code Online (Sandbox Code Playgroud)

我想“透视”这个报告,所以标题看起来像这样:

eff_date, symbol_id, source_id, datatypeValue1, ... DatatypeValueN
Run Code Online (Sandbox Code Playgroud)

即,对于 eff_date、symbol_id 和 source_id 的每个唯一组合,我想要一行。

但是,postgresql crosstab() 函数只允许键列。

有任何想法吗?

postgresql crosstab postgresql-9.4

2
推荐指数
1
解决办法
6703
查看次数

使用交叉表和计数的数据透视表

我必须显示这样的表格:

发表 没送到 没收到
2021年 10 86 75
2021年 二月 13 36 96
2021年 行进 49 7 61
2021年 四月 3 21 72

使用此查询生成的原始数据:

SELECT 
    year,
    TO_CHAR( creation_date, 'Month') AS month,
    marking,
    COUNT(*) AS count 
FROM invoices
GROUP BY 1,2,3
Run Code Online (Sandbox Code Playgroud)

我尝试过使用crosstab()但出现错误:

SELECT * FROM crosstab('
    SELECT 
        year,
        TO_CHAR( creation_date, ''Month'') AS month,
        marking,
        COUNT(*) AS count 
    FROM invoices
    GROUP BY 1,2,3
') AS ct(year text, month text, marking text)
Run Code Online (Sandbox Code Playgroud)

我不想手动输入所有标记值,因为它们很多。

ERROR:  invalid source data SQL …
Run Code Online (Sandbox Code Playgroud)

postgresql pivot-table dynamic-sql crosstab postgres-crosstab

2
推荐指数
1
解决办法
6937
查看次数

将表和更改日志合并到PostgreSQL中的视图中

我的PostgreSQL数据库包含一个用于存储已注册实体实例的表.此表格通过电子表格上传填充.Web界面允许操作员修改所呈现的信息.但是,原始数据不会被修改.所有的改变都存储在一个单独的表changes与列unique_id,column_name,valueupdated_at.

更改完成后,首先查询原始表,然后查询更改表(使用实例ID和最新更改日期,按列名称分组),将其呈现给操作员.这两个结果在PHP中合并,并在Web界面上显示.这是执行任务的一种相当严格的方式,我想将所有逻辑保留在SQL中.

我可以使用以下查询轻松选择表的最新更改:

SELECT fltr_chg.unique_id, fltr_chg.column_name, chg_val.value 
FROM changes AS chg_val
JOIN ( 
      SELECT chg_rec.unique_id, chg_rec.column_name, MAX( chg_rec.updated_at )
      FROM information_schema.columns AS source
      JOIN changes AS chg_rec ON source.table_name = 'instances'
                             AND source.column_name = chg_rec.column_name
      GROUP BY chg_rec.unique_id, chg_rec.column_name
     ) AS fltr_chg ON fltr_chg.unique_id = chg_val.unique_id
                  AND fltr_chg.column_name = chg_val.column_name;
Run Code Online (Sandbox Code Playgroud)

instances表中选择条目同样简单:

SELECT * FROM instances;
Run Code Online (Sandbox Code Playgroud)

现在,如果只有一种方法可以转换前一个结果并将结果值替换为后者,基于unique_idcolumn_name,并且仍将结果保留为表格,则问题将得到解决.这可能吗?

我确信这不是最罕见的问题,而且很有可能,某些系统会以类似的方式跟踪数据的变化.如果不是通过上述方法之一(当前和寻求的解决方案),他们如何将它们应用于数据?

php postgresql dynamic-sql crosstab plpgsql

1
推荐指数
1
解决办法
1234
查看次数