将T-SQL查询转换为Postgres

时间:2015-12-08 07:22:42

标签: sql postgresql plpgsql

我想将我的SQL Server查询转换为Postgres。 下面是我试图转换的查询,我在postgres中遇到错误

  

错误:#34;交叉表"或其附近的语法错误第2行:
  交叉表(SUM(VALUE)FOR VARIABLE IN(8,9))p                          ^ QUERY:选择TIMESTAMP_S,COALESCE(8,0)AS variable_8_value,COALESCE(9,0)AS variable_9_value来自   ARCHIEVE_EXPORT_DB_AR3 t
                 交叉表(SUM(VALUE)FOR VARIABLE IN(8,9))p语境:PL / pgSQL函数somefuncname()在EXECUTE语句中的第12行   **********错误**********

     

错误:#34;交叉表"或其附近的语法错误SQL状态:42601上下文:   PL / pgSQL函数somefuncname()在EXECUTE语句中的第12行

Declare @sql varchar(max);
Declare @sql2 varchar(max);
set @sql= STUFF((select distinct ','+ QUOTENAME(VARIABLE) from ARCHIEVE_EXPORT_DB_AR FOR XML PATH('')) ,1,1,'');
set @sql2= STUFF((select distinct ','+ 'ISNULL(' + QUOTENAME(VARIABLE) + ',0)' + ' AS ' + QUOTENAME('variable_' + cast(VARIABLE as varchar) + '_value') from ARCHIEVE_EXPORT_DB_AR FOR XML PATH('')) ,1,1,'');

set @sql='select TIMESTAMP_S,' + @sql2 + ' from ARCHIEVE_EXPORT_DB_AR t  
               PIVOT (SUM(VALUE) FOR VARIABLE IN ('+@sql+')) p';


exec(@sql);
CREATE OR REPLACE FUNCTION somefuncname() RETURNS int LANGUAGE plpgsql AS $$
Declare 
v_sql text;
Declare 
v_sql2 text;
BEGIN
v_sql :=  STRING_AGG(Distinct(("VARIABLE"):: text), ',')   From "ARCHIEVE_EXPORT_DB_A3";
v_sql2 := STRING_AGG(Distinct('COALESCE(' || ("VARIABLE"):: text || ',0) AS variable_' || ("VARIABLE"):: text) || '_value', ',')   From "ARCHIEVE_EXPORT_DB_A3";

v_sql :='select TIMESTAMP_S,' || v_sql2 || ' from ARCHIEVE_EXPORT_DB_AR3 t  
               crosstab(SUM(VALUE) FOR VARIABLE IN (' || v_sql ||')) p';
               execute(v_sql);
END
$$;
SELECT somefuncname();

1 个答案:

答案 0 :(得分:0)

this answer显示您未正确使用crosstab

crosstab在一个模块中;你把它包括在内了吗?并且交叉表中的查询需要用引号括起来。

我建议您在尝试在带有动态SQL的过程中使用crosstab之前,先专注于获取使用$original_date = '24/06/15'; $new_date = date('d/m/Y', strtotime($original_date)); 的基本查询。