2016-05-25 118 views
-1

我有下面的示例數據:SQL查詢來計算小計和總計

TimeSheetID RosterID EmpID RosterDate StartTime EndTime Total 
     1   101 1001 2016-05-24 07:00 15:00 8 
     2   101 1001 2016-05-24 16:00 21:00 5 
     3   101 1002 2016-05-24 07:00 15:00 8 
     4   101 1003 2016-05-24 07:00 15:00 8 
     5   101 1001 2016-05-25 07:00 15:00 8 
     6   101 1002 2016-05-25 07:00 15:00 8 
     7   101 1002 2016-05-25 16:00 22:00 6 
     8   101 1003 2016-05-25 07:00 15:00 8 
     9   101 1001 2016-05-26 07:00 14:00 7 
     10  101 1001 2016-05-26 15:00 21:00 6 
     11  101 1002 2016-05-26 07:00 15:00 8 
     12  101 1003 2016-05-26 07:00 15:00 8 
     13  101 1001 2016-05-27 07:00 15:00 8 
     14  101 1002 2016-05-27 07:00 15:00 8 
     15  101 1003 2016-05-27 07:00 15:00 8 
     16  101 1001 2016-05-28 07:00 15:00 8 
     17  101 1002 2016-05-28 07:00 15:00 8 
     18  101 1003 2016-05-28 07:00 15:00 8 
     19  101 1001 2016-05-29 07:00 15:00 8 
     20  101 1002 2016-05-29 07:00 15:00 8 
     21  101 1003 2016-05-29 07:00 15:00 8 
     22  102 1001 2016-05-30 07:00 15:00 8 

我想產生:

ID  RosterID EmpID RosterDate StartTime EndTime Total 
1  101  1001 2016-05-24 07:00  15:00 8 
2  101  1001 2016-05-24 16:00  21:00 5 
3  101  1001 2016-05-24 Null   Null 13 
4  101  1002 2016-05-24 07:00  15:00 8 
5  101  1003 2016-05-24 07:00  15:00 8 
6  101  1001 2016-05-25 07:00  15:00 8 
7  101  1002 2016-05-25 07:00  15:00 8 
8  101  1002 2016-05-25 16:00  22:00 6 
9  101  1002 2016-05-25 Null   Null 14 
10  101  1003 2016-05-25 07:00  15:00 8 
11  101  1001 2016-05-26 07:00  14:00 7 
12  101  1001 2016-05-26 15:00  21:00 6 
13  101  1001 2016-05-26 Null   Null 13 
14  101  1002 2016-05-26 07:00  15:00 8 
15  101  1003 2016-05-26 07:00  15:00 8 
16  101  1001 2016-05-27 07:00  15:00 8 
17  101  1002 2016-05-27 07:00  15:00 8 
18  101  1003 2016-05-27 07:00  15:00 8 
19  101  1001 2016-05-28 07:00  15:00 8 
20  101  1002 2016-05-28 07:00  15:00 8 
21  101  1003 2016-05-28 07:00  15:00 8 
22  101  1001 2016-05-29 07:00  15:00 8 
23  101  1002 2016-05-29 07:00  15:00 8 
24  101  1003 2016-05-29 07:00  15:00 8 
25  102  1001 2016-05-30 07:00  15:00 8 
26  Total  Null Null  Null   Null 168 

我想獲得使用SQL查詢彙總語句的樣本輸出因爲性能是問題。由於TimeSheet表將擁有數百萬條記錄。有沒有其他的方式來做這個寫作過程或功能,而不是視圖? 感謝您的幫助提前 問候 Ishwor

+3

什麼樣的數據?什麼數據庫引擎?你有架構嗎? – RegularlyScheduledProgramming

+1

你忘了包含你的樣本數據 – scsimon

+1

請大聲讀出:我正在使用DBMS ....,我試過這個代碼....但是我有一個問題....我的研究顯示,這個...這個......這個......可能有幫助。有人能指引我朝着正確的方向發展嗎? – Pred

回答

1

我認爲你不能在同一個表混合使用的數據結果。此外,如果這是可能的,我認爲這不是一個好主意。

你可以用一個類似的查詢得到小計:

select RosterID, EmpID, RosterDate, sum(Total) 
from tableRoster group by RosterID, EmpID, RosterDate; 

總比較容易,你可以用這個得到它:

select sum(Total) from tableRoster; 
+0

謝謝喬斯,它看起來很簡單,但它做了令人驚歎的工作和良好的性能.....非常感謝你 –

+0

@IshworKhanal [當某人回答我的問題時,你該怎麼辦?](http://stackoverflow.com/help/someone-answers)你似乎沒有接受你給過的單個答案。 – RiggsFolly

0

我想利用你的首選方法。 ..雖然可能有一些扭曲的工作。道歉,如果它沒有按照所希望的100%工作,但也許你可以採取下面的做法並根據你的需要進行修改。

我的懷疑是,包括在那裏的開始/結束日期將導致可以忽略的微不足道的小組。我意識到沒有充分測試我的解決方案對於這個論壇來說並不理想......對此感到抱歉......僅僅是因爲工作的快速分心而隨心所欲地激發了它。祝你好運。

SELECT 
CASE WHEN (GROUPING(RosterID) = 1) THEN 'Total' 
     ELSE RosterID 
END AS RosterID 
,CASE WHEN (GROUPING(EmpID) = 1) AND (GROUPING(RosterID) = 1) THEN NULL 
     ELSE EmpID 
END AS EmpID 
,CASE WHEN (GROUPING(RosterDate) = 1) AND (GROUPING(RosterID) = 1) THEN NULL 
     ELSE RosterDate 
END AS RosterDate 
,CASE WHEN (GROUPING(RosterDate) = 1) THEN NULL 
     ELSE StartTime 
END AS StartTime 
,CASE WHEN (GROUPING(RosterDate) = 1) THEN NULL 
     ELSE EndTime 
END AS EndTime 
,Sum(Total) AS Total 
FROM Table a 
GROUP BY 
ROLLUP(RosterID ,RosterDate ,EmpID ,StartTime ,EndTime) 
ORDER BY 
RosterID, RosterDate, EmpID