作者 主題: [已解決]SQL找最近的值的問題  (閱讀 7255 次)

0 會員 與 1 訪客 正在閱讀本文。

shaderayman

  • 可愛的小學生
  • *
  • 文章數: 2
    • 檢視個人資料
[已解決]SQL找最近的值的問題
« 於: 2009-09-16 14:21 »
SELECT
A,
B
FROM
TABLE
WHERE
YEAR(DATE) = 2009 AND MONTH(DATE) = 8

這個SQL是要把某年某月的A, B列出來(A, B均為數字),
如果A有資料,則取當月A跟B

如果A沒有資料(null)要去找上個月的資料,
如果A再沒有資料又要去找上上個月的資料,
直到A有資料的那個月,取那個月的A跟B

請問要如何用一個SQL達成此目的?



感謝各位大大,提供許多寶貴的意見,明天再試看看。
« 上次編輯: 2009-09-17 19:19 由 shaderayman »

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: [請教]SQL找最近的值的問題
« 回覆 #1 於: 2009-09-16 14:27 »
SELECT
A,
B
FROM
TABLE
WHERE
YEAR(DATE) = 2009 AND MONTH(DATE) = 8

這個SQL是要把某年某月的A, B列出來(A, B均為數字),
如果A有資料,則取當月A跟B

如果A沒有資料(null)要去找上個月的資料,
如果A再沒有資料又要去找上上個月的資料,
直到A有資料的那個月,取那個月的A跟B

請問要如何用一個SQL達成此目的?

有要跨年嗎? 還是都是 2009 ?
« 上次編輯: 2009-09-16 14:29 由 yamaka »

shaderayman

  • 可愛的小學生
  • *
  • 文章數: 2
    • 檢視個人資料
回覆: [請教]SQL找最近的值的問題
« 回覆 #2 於: 2009-09-16 14:34 »
SELECT
A,
B
FROM
TABLE
WHERE
YEAR(DATE) = 2009 AND MONTH(DATE) = 8

這個SQL是要把某年某月的A, B列出來(A, B均為數字),
如果A有資料,則取當月A跟B

如果A沒有資料(null)要去找上個月的資料,
如果A再沒有資料又要去找上上個月的資料,
直到A有資料的那個月,取那個月的A跟B

請問要如何用一個SQL達成此目的?

有要跨年嗎? 還是都是 2009 ?

有可能需要,只要找不到資料,就要一直往上個月找資料,今年找不到就要到去年找資料。

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: [請教]SQL找最近的值的問題
« 回覆 #3 於: 2009-09-16 14:53 »
有要跨年嗎? 還是都是 2009 ?

有可能需要,只要找不到資料,就要一直往上個月找資料,今年找不到就要到去年找資料。


目前想到比較簡單的做法是...

年月不要分開判斷, 先找出 <= 指定的年月(subquery), 然後以這個年月資料來撈資料..

dscwferp

  • 憂鬱的高中生
  • ***
  • 文章數: 157
    • 檢視個人資料
回覆: [請教]SQL找最近的值的問題
« 回覆 #4 於: 2009-09-16 15:02 »
SELECT         B.A, B.B
FROM             (SELECT         MAX(DATE) AS DATE
                           FROM              TABLE
                           WHERE          (A <> N'')) A INNER JOIN
                          TABLE B ON A.DATE= B.DATE
MSN:dscwferp@yahoo.com.tw
ERP民國百年序問題解決!
舊ERP在新WIN7上相容問題解決!
http://dscwferp.blogspot.com/

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: [請教]SQL找最近的值的問題
« 回覆 #5 於: 2009-09-16 15:23 »
SELECT         B.A, B.B
FROM             (SELECT         MAX(DATE) AS DATE
                           FROM              TABLE
                           WHERE          (A <> N'')) A INNER JOIN
                          TABLE B ON A.DATE= B.DATE


有人直接丟魚出來啦~~
那當我前面什麼都沒說吧..

dscwferp

  • 憂鬱的高中生
  • ***
  • 文章數: 157
    • 檢視個人資料
回覆: [請教]SQL找最近的值的問題
« 回覆 #6 於: 2009-09-16 15:38 »
SORRY!
這條魚有點生病(有BUG)
因為這種魚我常釣到
以為很普通
所以丟出來
請見諒!
MSN:dscwferp@yahoo.com.tw
ERP民國百年序問題解決!
舊ERP在新WIN7上相容問題解決!
http://dscwferp.blogspot.com/

ricky

  • 實習板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
回覆: [請教]SQL找最近的值的問題
« 回覆 #7 於: 2009-09-16 16:52 »
這是不可能的
改用store procedure吧
畢竟這個得用迴圈或是遞迴的方式去解決

SELECT
A,
B
FROM
TABLE
WHERE
YEAR(DATE) = 2009 AND MONTH(DATE) = 8

這個SQL是要把某年某月的A, B列出來(A, B均為數字),
如果A有資料,則取當月A跟B

如果A沒有資料(null)要去找上個月的資料,
如果A再沒有資料又要去找上上個月的資料,
直到A有資料的那個月,取那個月的A跟B

請問要如何用一個SQL達成此目的?
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

38pig

  • 可愛的小學生
  • *
  • 文章數: 20
    • 檢視個人資料
回覆: [請教]SQL找最近的值的問題
« 回覆 #8 於: 2009-09-16 17:49 »
SELECT
A,
B
FROM
TABLE
WHERE
YEAR(DATE) = 2009 AND MONTH(DATE) = 8

這個SQL是要把某年某月的A, B列出來(A, B均為數字),
如果A有資料,則取當月A跟B

如果A沒有資料(null)要去找上個月的資料,
如果A再沒有資料又要去找上上個月的資料,
直到A有資料的那個月,取那個月的A跟B

請問要如何用一個SQL達成此目的?

樓主的思意是要找到 A不為NULL 最接近2009/8月的那筆資料嗎?

SELECT TOP 1 A,B
FROM TABLE
WHERE YEAR(DATE) <= 2009 AND MONTH(DATE) <= 8 AND A IS NOT NULL
ORDER BY DATE DESC

還是我把問題想的太簡單了?
(PS. 還看了好幾遍)




Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: [請教]SQL找最近的值的問題
« 回覆 #9 於: 2009-09-16 18:01 »
SELECT TOP 1 A,B
FROM TABLE
WHERE YEAR(DATE) <= 2009 AND MONTH(DATE) <= 8 AND A IS NOT NULL
ORDER BY DATE DESC

9~12月的呢?

dscwferp

  • 憂鬱的高中生
  • ***
  • 文章數: 157
    • 檢視個人資料
回覆: [請教]SQL找最近的值的問題
« 回覆 #10 於: 2009-09-16 18:08 »
SELECT         B.A, B.B
FROM             (SELECT         MAX(DATE) AS DATE
                           FROM              TABLE
                           WHERE          NOT (A IS NULL )) A INNER JOIN
                          TABLE B ON A.DATE= B.DATE

先找出 A 有資料的 DATE 最大值, 就是最近那個月
然後再去找那個月的A B 值出來
簡單啊!
會複雜嗎?
 ??? ??? ???
MSN:dscwferp@yahoo.com.tw
ERP民國百年序問題解決!
舊ERP在新WIN7上相容問題解決!
http://dscwferp.blogspot.com/

38pig

  • 可愛的小學生
  • *
  • 文章數: 20
    • 檢視個人資料
回覆: [請教]SQL找最近的值的問題
« 回覆 #11 於: 2009-09-16 18:57 »
SELECT TOP 1 A,B
FROM TABLE
WHERE YEAR(DATE) <= 2009 AND MONTH(DATE) <= 8 AND A IS NOT NULL
ORDER BY DATE DESC

9~12月的呢?

嗯, 一直注意看
引用
如果A沒有資料(null)要去找上個月的資料,
如果A再沒有資料又要去找上上個月的資料,
直到A有資料的那個月,取那個月的A跟B,

忘了, 最主要的
引用
這個SQL是要把某年某月的A, B列出來(A, B均為數字),
如果A有資料,則取當月A跟B,

SELECT
  (CASE WHEN B.A IS NULL
           THEN  (SELECT TOP 1 A.A 
                                FROM TABLE AS A 
                                WHERE A.DATE<=B.DATE AND A.A IS NOT NULL
                                ORDER BY A.DATE DESC)
           ELSE B.A
  END) AS A,
  B.B AS B
FROM TABLE AS B


Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: [請教]SQL找最近的值的問題
« 回覆 #12 於: 2009-09-16 19:03 »
SELECT         B.A, B.B
FROM             (SELECT         MAX(DATE) AS DATE
                           FROM              TABLE
                           WHERE          NOT (A IS NULL )) A INNER JOIN
                          TABLE B ON A.DATE= B.DATE

先找出 A 有資料的 DATE 最大值, 就是最近那個月
然後再去找那個月的A B 值出來
簡單啊!
會複雜嗎?
 ??? ??? ???

樓主的原意要能指定某年某月
所以不能直接用 MAX(DATE) 啊
subquery 要抓指定年月或之前的

如果我沒會錯意的話
以下列的資料來說

代碼: [選擇]
id   A    B   DATE
1, 45,   374, 2008-06-30 22:27:22,
2, 39,   398, 2008-07-03 22:29:05,
3, 65,   343, 2008-07-21 22:45:55,
4, NULL, 654, 2008-08-02 18:15:36,
5, 67,   542, 2008-09-13 18:13:57,
6, 56,   783, 2008-10-01 21:29:26,
7, 84,   632, 2009-07-06 15:31:04;

剛剛用我最開始的想法試了一下(MySQL 5.0.x)
如果要抓 2008年8月的資料
應該要能自動到 2008-07 的兩筆資料
或是要抓 2009-05, 則會抓 2008-10-01 這筆

SELECT A, B FROM TABLE 
WHERE DATE(取年月) = ( SELECT DATE(取年月) FROM TABLE WHERE DATE(取年月) <= '指定年月' .............. )

指定年月為 2008-08, 結果:
39, 398
65, 343

指定年月為 2009-04, 結果:
56, 783