2014-08-27 183 views
0

選擇列我有一個PostgreSQL數據庫和要顯示以下每月和列今年

------------select/display this---------------- 
Year |Jan |Feb |Mar |Apr |May |...|Dec | 
----------------------------------------------- 
2014 |199 |188 |174 |121 |170 |...|200 | 
2013 |160 |140 |160 |170 |160 |...|140 | 
2012 |255 |270 |260 |270 |260 |...|140 | 

和我的表如下所示:

table employeePlans 
----------------------------------------- 
id |month(date)|plannedHours |emplyee_id 
----------------------------------------- 
1 |2012-01-01 |255   | 1 
2 |2012-02-01 |270   | 1 
3 |2012-03-01 |260   | 1 
4 |2012-04-01 |270   | 1 
5 |2012-04-01 |333   | 2 
.. |...  |...   | .. 
9 |2014-01-01 |199   | 1 
10 |2014-02-01 |188   | 1 

每月份是唯一的,當天是本月的第一天(2014-05- )
我實際上使用JPA,如果我可以查詢它並將其包裝到我的實體類中,並將其顯示在我的JavaFX tableview中會更好。
JPA實體類:

@Entity 
@Table(name = "employeeplannedhours", uniqueConstraints 
     = @UniqueConstraint(columnNames = {"month", "employee_id"})) 
public class EmployeePlannedHours implements Serializable { 
private static final long serialVersionUID = 1L; 

//Types are actually JavaFX properties 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "id") 
private Integer id; 

@Column(name = "month") 
@Temporal(TemporalType.DATE) 
private Date month; 

@Column(name = "plannedhours") 
private BigDecimal plannedhours; 

@JoinColumn(name = "employee_id", referencedColumnName = "id") 
@ManyToOne 
private Employee employee; 

public EmployeePlannedHours() { 
} 

//Getter and Setters 
} 

我想出現在爲止通過旋轉和交叉閱讀起來很:

SELECT * 
    FROM 
    crosstab('SELECT date_part('year', month)::double as year, 
       //???How can I get plannedhours for every month???, 
       WHERE employee_id = 1     
       GROUP BY year 
       ORDER BY year') 
     As ct(year double, jan numeric, feb numeric, mar numeric, 
      apr numeric, may numeric, jun numeric, jul numeric, 
      aug numeric, sep numeric, oct numeric, nov numeric, 
      dec numeric) 
+0

那你究竟要顯示?是否只有一名員工?所有員工的計劃時間總和?你是否關注外觀(你需要的答案是看你畫的方式,這是幾個月的列)或只是相同的數據? – Deltharis 2014-08-27 11:51:56

+0

我需要每年的專欄和專欄。我不想要計劃好的時間總和。我會標記我想要展示的大膽(這是第一張桌子,一年的列,一月,二月......)。 如果您不瞭解數據。請在employeePlans表的第9行 - > plannedHours = 199和日期2014年1月的第9行看到,該行應顯示在'2014'行中的select語句和'jan'列中的值爲'199' 是的我只是爲了一名員工 – haisi 2014-08-27 12:03:08

+1

這可能沒有幫助,但我在Oracle中會做的是'Group By Emp_ID,Year'。在我的'選擇'中,我會創建12列,每個月使用以下代碼:'Max(case when to_char(date,'MM')='01'Then PlannedHours End)as Jan'並繼續每個月。另外,我會顯示'EMP_ID,to_char(date,'YYYY')'我不知道PostGrepSQL,但會想象有類似的功能。如果這有效,我會將其作爲答案發布。 – Phillip 2014-08-27 12:45:15

回答

0

我將使用SQL查詢,並希望它會幫助你在postgresql

with g 
as 
(select datename(month,[month]) as Month, year(month) as Year,sum(plannedHours) as PlannedHours 
    from employeePlans 
    group by year(month),datename(month,[month]) 
) 
select Year,[Jan],[Feb],[Mar],...[Dec] 
from g 
pivot(sum(PlannedHours) for Month in([Jan],[Feb],....[Dec])) p 

的想法,把月份字段拆分成月份名和葉ar和你在計劃時間內由他們分組,那麼你應用關鍵點

爲什麼要應用該組?因爲你的表可能包含同月不同的員工

希望它會幫助你

問候