2012-09-25 80 views
1

總請假小時,我有一個Leave表按如下:查詢顯示每月

MONTH | NAME | DAY1 | DAY2 | DAY3 | ... | DAY31 
------------------------------------------------  
     |  |  |  |  | ... |  

DAY1DAY31保持的時間被點名者一直沒有在辦公室的電話號碼。

我需要一個查詢生成的輸出:

MONTH | NAME | TOTAL_MONTH_HOURS 
---------------------------------  
     |  |   

其中TOTAL_MONTH_HOURS是本月所有時間總和;即DAY1 + DAY2 + ... + DAY30+DAY31

我該如何寫這個查詢?有沒有什麼辦法可以避免像上面那樣對所有列進行求和?我不時遇到類似的問題,桌子變得更大!

注意:由於變量的月份長度,某些列可能是NULL

+2

你應該使用'1NF'。 – hjpotter92

+0

這不是我的設計;但是,無論如何,我必須使用它! :-) – RGO

+1

既然你這樣設計你的數據庫,我相對肯定你不知道@GiantofaLannister的'1NF'註釋是什麼意思,所以讓我幫忙一下 - 它是「[First Normal Form]( http://en.wikipedia.org/wiki/First_normal_form)」。 – Interrobang

回答

4

最簡單的,鑑於目前的表結構,是簡單地做到這些 -

Select Month, Name, Day1+Day2+Day3....+Day31 Total_Month_Hours 
    From Tbl 

現在,如果有可能有空值,並且是對這個問題的原因,與COALESCE包裝他們。 COALESCE是ANSI SQL99標準的一部分,並支持所有主要的RDBMS(MySQLOracleSQLitePostgreSQLSQL Server)。

Select Month, 
     Name, 
     COALESCE(Day1,0)+COALESCE(Day2,0)+...+COALESCE(Day31,0) Total_Month_Hours 
    From Tbl 
+1

+1由於OP刪除了RDBMS規範,所以我認爲你會想'COALESCE'而不是'IFNULL'。 – pilcrow

+0

謝謝pilcrow - 更新:) – RichardTheKiwi

2

既然你不能改變你的表格,在這裏:

SELECT `month`, `name`, (DAY1+DAY2+DAY3+DAY4+DAY5+DAY6+DAY7+DAY8+DAY9+DAY10+DAY11+DAY12+DAY13+DAY14+DAY15+DAY16+DAY17+DAY18+DAY19+DAY20+DAY21+DAY22+DAY23+DAY24+DAY25+DAY26+DAY27+DAY28+DAY29+DAY30+DAY31) AS `total_month_hours` 
FROM `table_name`