2016-03-07 39 views
0

我正在通過SQL服務器的終極平臺內部使​​用Cognos 10 Query Studio。需要想法如何從表中使用Cognos裏面的Cognos裏面的日期記錄

基本上,我有一張表格,每位員工支付每期工資總額。該表是這樣的:

Employee1 - PayPeriodStateDate1 - PayPeriodEndDate1 - PayDate1 - GrossPay1 
Employee1 - PayPeriodStateDate2 - PayPeriodEndDate2 - PayDate2 - GrossPay2 
Employee1 - PayPeriodStateDate3 - PayPeriodEndDate3 - PayDate3 - GrossPay3 
Employee2 - PayPeriodStateDate1 - PayPeriodEndDate1 - PayDate1 - GrossPay1 
Employee2 - PayPeriodStateDate2 - PayPeriodEndDate2 - PayDate2 - GrossPay2 
Employee2 - PayPeriodStateDate3 - PayPeriodEndDate3 - PayDate3 - GrossPay3 

等等......除了有數千員工和數千名支付期的超過約二十年。

我需要爲每位員工提供一份包含最近52次記錄(過去兩年)平均值的清單。顯然,如果每個員工都有一個不間斷的服務時間,這將非常容易。我可以採取current_date - 2年,對吧?

問題是,許多員工離開並回來。如果Joe Blow從2015年7月到2015年11月離開(十個薪酬階段),他將在前42個薪酬階段獲得平均薪酬。

我很確定我可以在此Cognos環境中的查詢中使用SQL。我怎樣才能得出前兩年所有記錄的清單,計算記錄的數量,並將這些記錄的總數除以我計算的數字?有任何想法嗎?

謝謝!

+1

對不起,我不太瞭解Cognos和sql server有什麼可用,但是sql server窗口函數可能會導致此問題。您可以按員工劃分結果,按最近的付款日期排序,然後從該集合和平均值中獲取前52個結果。再一次,我不知道這是否兼容,只是一個想法。 – dfundako

+0

我很確定我可以在這些查詢中編寫SQL。我使用了其他更簡單的SQL命令。我只在這個系統中工作了幾天,所以我不確定它能做什麼,不能做什麼。我的問題是我在SQL方面並不擅長。我無法在僅限SQL的環境中執行此操作。我會使用「選擇」和「分組方式」創建派生表嗎? –

回答

1

此解決方案使用通用表格表達式(CTE)和窗口函數來查找最近52條記錄的平均總工資。第一個CTE將抓住你所有的員工,抓住他們所有相關的薪資金額,然後將他們從最近到最老排名。第二個CTE將使用該結果集來獲取最近52個範圍內的所有記錄。查詢的最後部分將使用該記錄集來平均每個員工的金額。我沒有做臨時表來檢查數據,但它解析得很好。請讓我知道它是怎麼回事。

;with EmpRanking AS (
SELECT 
employeeID 
, grosspay 
, ROW_NUMBER() OVER(PARTITION BY employeeID ORDER BY paydate desc) AS record_Counter 

FROM your_table) 

, EmpRanking52 AS (
SELECT employeeID 
, grosspay 
, record_counter 

FROM EmpRanking 

WHERE record_counter <= 52) 

SELECT employeeID 
, AVG(GrossPay) AS avg_pay 

FROM EmpRanking52 

GROUP BY employeeID 
+0

謝謝!我現在正走出辦公室,但我會玩弄這個,並在早上第一次嘗試。 –

+0

作爲純Cognos替代品,您可以用Cognos中的查詢替換CT​​E。您的第一個查詢將與「EmpRanking」相同,您的第二個查詢將從查詢一查詢等。 – Andrew