我正在尝试找到一种在 Postgres 中进行数据透视的方法,但我可以 \xe2\x80\x99t 使用它,我正在尝试寻找另一种方法。我发现以下网站解释了 SQL Server 中的数据透视表,示例之一正是我想要做的。http://sqlhints.com/2014/03/10/pivot-and-unpivot-in-sql-server/
\n\n例子是:
\n\nCREATE 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\nSELECT *FROM CourseSales\nPIVOT(SUM(Earning) \nFOR Course IN ([.NET], Java)) AS PVTTable;\n
Run Code Online (Sandbox Code Playgroud)\n\n我想在 postgresql 中做同样的事情,但是使用像上面这样的动态方式。
\n我有一张“瘦高”事实表:
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() 函数只允许键列。
有任何想法吗?
我必须显示这样的表格:
年 | 月 | 发表 | 没送到 | 没收到 |
---|---|---|---|---|
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)
我不想手动输入所有标记值,因为它们很多。
Run Code Online (Sandbox Code Playgroud)ERROR: invalid source data SQL …
postgresql pivot-table dynamic-sql crosstab postgres-crosstab
我的PostgreSQL数据库包含一个用于存储已注册实体实例的表.此表格通过电子表格上传填充.Web界面允许操作员修改所呈现的信息.但是,原始数据不会被修改.所有的改变都存储在一个单独的表changes
与列unique_id
,column_name
,value
和updated_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_id
和column_name
,并且仍将结果保留为表格,则问题将得到解决.这可能吗?
我确信这不是最罕见的问题,而且很有可能,某些系统会以类似的方式跟踪数据的变化.如果不是通过上述方法之一(当前和寻求的解决方案),他们如何将它们应用于数据?
postgresql ×4
crosstab ×3
dynamic-sql ×2
php ×1
pivot ×1
pivot-table ×1
plpgsql ×1
sql ×1
sql-server ×1