SQL語法改寫請教




立即點擊


請問sql語法是否有辦法將原本資料庫的資料格式(如下),a欄b欄c欄001200912100001201001200001201002300001201003400002200912150002201001250002201002350002201003450.....改寫成每個員工(a欄)只有一筆資料,依照我選擇的年月(b欄),別別列出前3個月的金額(c欄)嗎?即條件下whereb欄=201003呈現結果如下a欄b欄-3個月的金額b欄-2個月的金額b欄-1個月的金額001100...顯示更多請問sql語法是否有辦法將原本資料庫的資料格式(如下),a欄b欄c欄001200912100001201001200001201002300001201003400002200912150002201001250002201002350002201003450.....改寫成每個員工(a欄)只有一筆資料,依照我選擇的年月(b欄),別別列出前3個月的金額(c欄)嗎?即條件下whereb欄=201003呈現結果如下a欄b欄-3個月的金額b欄-2個月的金額b欄-1個月的金額001100200300002150250350更新:謝謝回答者:kenny我是用ORACLE的資料庫,一樣適用嗎?發現我程度實在太差了...你寫的語法我都看不懂....





select a,sum(c1) as c1,sum(c2) as c2,sum(c3) as c3 from (SELECT a,c as c1,0 as c2,0 as c3 FROM yahoo where b = left(SUBDATE(concat('2010-03','-01'),INTERVAL 3 MONTH),7) group by a union all SELECT a,0 as c1,c as c2,0 as c3 FROM yahoo where b = left(SUBDATE(concat('2010-03','-01'),INTERVAL 2 MONTH),7) group by a union all SELECT a,0 as c1,0 as c2,c as c3 FROM yahoo where b = left(SUBDATE(concat('2010-03','-01'),INTERVAL 1 MONTH),7) group by a) as z group by a 我是用mysql,b欄位在這我改成xxxx-xx的方式來處理,這種解法效能不一定比較好 建議b欄位改date可能會比較好處理,利用日期處理函數 你再參考看看 2010-03-17 07:14:15 補充: 不適用,但觀念應該差不多,ORACLE有自己的日期處理函數。 c1是指12月,c2是指1月,c3是指2月 以下這段只是先找去年12月的內容,利用mysql的日期處理函數SUBDATE() SELECT a,c as c1,0 as c2,0 as c3 FROM yahoo where b = left(SUBDATE(concat('2010-03','-01'),INTERVAL 3 MONTH),7) group by a 這段執行的結果會是 a c1 c2 c3 001 100 0 0 002 150 0 0 2010-03-17 07:14:39 補充: 再利用union all語法找出1月份內容,變成12月與1月份合併的資料 SELECT a,c as c1,0 as c2,0 as c3 FROM yahoo where b = left(SUBDATE(concat('2010-03','-01'),INTERVAL 3 MONTH),7) group by a union all SELECT a,0 as c1,c as c2,0 as c3 FROM yahoo where b = left(SUBDATE(concat('2010-03','-01'),INTERVAL 2 MONTH),7) group by a 2010-03-17 07:14:59 補充: 這段執行的結果會是 a c1 c2 c3 001 100 0 0 002 150 0 0 001 0 200 0 002 0 250 0 再union all 2月份的內容變成12月與1月份與2月份合併的資料 也許一次看比較難懂,但是主要是要分解拆開來得到個別答案後,最後再組合成你要的結果,也就是最外圍的select,去加總前三個月的資料即可 2010-03-17 21:11:42 補充: 再union all 結合1月份c2的結果 SELECT a,0 as c1,c as c2,0 as c3 FROM yahoo where b = left(SUBDATE(concat('2010-03','-01'),INTERVAL 2 MONTH),7) group by a 2段union all後執行的結果會是 a c1 c2 c3 001 100 0 0 002 150 0 0 001 0 200 0 002 0 250 0 2010-03-17 21:14:47 補充: 最後再union all 2月份 找出所需月份的資料後,加總變成最後的結果,也就是最外面的select語法 主要先把個個條件式(日期)判斷好後,再去組合成你最後的結果。 希望有幫到你 2010-03-17 21:21:11 補充: 上面2個多補充了= =








以上文章來自奇摩知識家,如有侵犯請留言告知


https://tw.answers.yahoo.com/question/index?qid=20100315000010KK05346

AAFD2ED9159ECC62
arrow
arrow

    最美公主 發表在 痞客邦 留言(0) 人氣()