2015-03-14 3 views
-1

Мое требование таково: Я использую Postgresql и ireport 4.0.1 для создания этого отчета. У меня есть четыре таблицы, такие как g_employee, g_year, g_period, g_salary, путем объединения этих четырех таблиц, а параметр передачи - fromDate и toDate эти значения параметров, такие как '01/02/14 'между '01 /05/14'Based. дисплейные месяцы будут варьироваться в заголовках, как я показано в примере ниже:Заработная плата служащего Должен отображаться ежемесячно, как показывает моль Горизонтально как заголовки

EmpName

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

Может кто-нибудь помочь мне в этом получая выход?

ответ

1

То, что вы описываете, похоже на количество столбцов, будет расти или сокращаться в зависимости от количества месяцев между двумя параметрами, , который просто не работает.

Я не знаю, как добавить дополнительные столбцы на основе интервала между двумя параметрами без генерируемого процедурным кодом 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_period»

EDIT - Другой вариант: Чем меньше динамический вариант, который требует больше параметров будет:

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; 
+0

Спасибо за ответ, но я не нужен выход такой. Мое требование - это периоды, которые должны отображаться горизонтально, а также зарплаты для соответствующих emp's.Каждый кто-нибудь мне поможет .. – user3305333

+0

Thats просто не так, как работает SQL. Число столбцов является константой для любого действительного оператора SQL. – RileyR

+0

Вам нужно что-то, чтобы моделировать данные так, как вы пожелаете, либо процедурный код, либо приложение моделирования, которое возьмет то, что я предоставил, и покажет его способ запроса. Другой вариант не является динамическим в зависимости от диапазона ввода (вы должны вручную добавлять или удалять столбцы при изменении диапазона). Я покажу этот пример. – RileyR

0

я создать одну таблицу #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) 

надеюсь, что это поможет