Postgresql 员工工资应每月显示为月,水平显示为标题

Postgresql 员工工资应每月显示为月,水平显示为标题,postgresql,jasper-reports,pivot,crosstab,Postgresql,Jasper Reports,Pivot,Crosstab,我的要求如下: 我使用Postgresql和ireport 4.0.1生成此报告。 我有四个表,如g_employee、g_year、g_period、g_salary,通过连接这四个表并传递参数是fromDate和toDate,这些参数值如'01/05/14'之间的'01/02/14'。基于这些参数,显示的月份在标题中会有所不同,如下面的示例所示: EmpName 01/02/14 01/03/14 01/04/14 01/05/14 abc

我的要求如下: 我使用Postgresql和ireport 4.0.1生成此报告。 我有四个表,如g_employee、g_year、g_period、g_salary,通过连接这四个表并传递参数是fromDate和toDate,这些参数值如'01/05/14'之间的'01/02/14'。基于这些参数,显示的月份在标题中会有所不同,如下面的示例所示:

EmpName

       01/02/14     01/03/14    01/04/14    01/05/14
  abc   
            2000            3000    3000    2000

有人能帮我获取输出吗?

您所描述的内容听起来像是列的数量会根据两个参数之间的月数而增加或减少,这根本不起作用

如果没有过程代码生成的sql语句,我不知道如何根据两个参数之间的间隔添加额外的列

可能的情况是:

emp_id1  period1 salary
emp_id1  period2 salary
emp_id1  period3 salary
epd_id1  period4 salary
emp_id2  period1 salary
emp_id2  period2 salary
emp_id2  period3 salary
epd_id2  period4 salary
通过以下方式生成:

select g_employee_id,
       g_period_start,
       g_salary_amt
  from g_employee, g_year, g_period, g_salary
 where <join everything>
   and g_period_start between date_param_1 and date_param_2
  group by g_employee_id, g_period_start;
如果没有表结构,很难获得更具体的信息。 随着date_param_1和date_param_2之间的范围增加,该g_期间每个有薪员工的行数将增加

编辑-其他选项: 需要更多参数的不太动态的选项是:

select g_employee_id,
       (select g_salary_amount
          from g_period, g_salary
         where g_period_id = g_salary_period_id
           and g_salard_emp_id = g_employee_id
           and g_period_start = <DATE_PARAM_1> ) as "DATE_PARAM_1_desc",
       (select g_salary_amount
          from g_period, g_salary
         where g_period_id = g_salary_period_id
           and g_salard_emp_id = g_employee_id
           and g_period_start = <DATE_PARAM_2> ) as "DATE_PARAM_2_desc",
       (select g_salary_amount
          from g_period, g_salary
         where g_period_id = g_salary_period_id
           and g_salard_emp_id = g_employee_id
           and g_period_start = <DATE_PARAM_3> ) as "DATE_PARAM_3_desc"
        ,..... -- dynamic not possible
   from employee;

我创建一个表g_employee并插入虚拟数据

create table #g_employee(empid int,yearid int,periodid int,salary int)
insert into #g_employee(empid,yearid,periodid,salary)
select 1,2014,02,2000
union
select 2,2014,02,2000
union
select 3,2014,02,2000
union
select 3,2014,03,2000
union
select 1,2014,03,3000
union
select 1,2014,04,4000
根据您的要求输出查询:

解决方案1:

select empid, max(Case when periodid=2 and yearid=2014 then salary end) as '01/02/2014'
, max(Case when periodid=3 and yearid=2014 then salary end) as '01/03/2014'
, max(Case when periodid=4 and yearid=2014 then salary end) as '01/04/2014'
from #g_employee
group by empid
您可以使用动态sql执行以下操作:

解决方案2:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(periodid) 
                    from #g_employee
                    group by periodid

            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT empid,' + @cols + ' from 
             (
                select salary, periodid,empid
                from #g_employee
            ) x
            pivot 
            (
                max(salary)
                for periodid in (' + @cols + ')
            ) p '

execute(@query)

希望这会有所帮助

谢谢您的回复,但我不需要这样的输出。我的要求是周期应该水平显示,相应的emp的工资也应该水平显示。有人能帮我吗?SQL不是这样工作的。对于任何有效的SQL语句,列数都是一个常量。您需要一些东西来按照您希望的方式对数据进行建模,可以是过程代码,也可以是一个建模应用程序,它将采用我提供的内容并以请求方式显示。另一个选项不是基于输入范围的动态选项,您必须在范围更改时手动添加或删除列。我将展示这个例子。