找出沒有紀錄的人

edited 十月 2013 in 資料庫
如題,我說明一下,
table大約是這些欄位
Account(vchar), Date(date), Revenue(int)
假設裡面有幾筆資料,實際上很多筆
1, 2008-10-11, 200
1, 2008-11-11, 200
1, 2008-12-11, 200
2, 2008-12-11, 200
3, 2008-11-11, 200
3, 2008-12-11, 200
5, 2008-11-11, 0
5, 2008-12-11, 0

若我要在1, 2, 3, 4, 5這些中算出連續三個月(2008-10~12), 沒有任何一筆資料(例如4此人), 或是就算有資料但三個月Revenue總和為0(例如5)的一共有幾人(本例為2人)

我是故意讓4沒有在table沒有任何一筆的,因為就是要算出他來



原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=5528

評論

  • edited 十一月 2010
    假設這個資料表的名稱為 a ,另外有一個儲存 Account 資訊的資料表 b ,可以這樣子做
    SELECT a.* FROM a
    LEFT JOIN b ON b.Account = a.Account
    WHERE b.Account IS NULL
    
  • edited 十一月 2010
    這好複雜喔 ....
    kiang 的做法有個問題點 , 假設若所有人某一個月都沒資料 , 那麼就會漏掉該月資料

    要不要借助 TMP TABLE 比較好做
    如果是我
    我會先建立一個 TMP TABLE 將要檢查的年月範圍先建立出連續的資料

    2010-01-01
    2010-02-01
    2010-03-01

    然後這個 TMP TABLE 再與妳原本的資料及會員資料做 LEFT OUTER JOIN 就很簡單了
    而做 join 時 , 妳原本的資料中的日期欄位要先用一些 MYSQL FUNCTION 將"日"的部分想辦法轉為 1
    我想這樣應該就沒問題了
  • edited 十一月 2010
    恩,感謝,的確會有盲點 :)

    如果 Revenue 可以為 0 ,也不介意多塞幾筆 0 的資料,那麼其實先用迴圈跑連續的月份,將缺少的資料補齊,然後直接計算連續3個月 Revenue 為 0 的資料,應該也會單純些。簡單的說,拆成兩個邏輯,不需要硬是一次做完,程式也會乾淨許多。
  • 1.假設 1,2,3,4,5 每個 Account 都是固定 3 個月的資料
    2.因為 Account(vchar), Date(date), Revenue(int) 裡面用到 Date 關鍵字,所以將原資料建成
    一個 table m 裡面三個欄位(x,y,z) 對映上面三個欄位
    3.另外建一個 table n 裡面只有一個欄位 w 放的是所有的 Account=> 1,2,3,4,5
    那麼 sql 如下:

    select w,Revenue
    FROM(
    select w,IFNULL(Sum(z),0) as Revenue
    from n
    left join m on n.w=m.x
    group by n.w
    ) as temp
    where Revenue=0

    就只得到 4,5
  • user_account : id , account_data
    user_sign : id , sign_time

    select a.id, b.login_counts from user_account A left join
    (select id,count(id) as login_counts from user_sign group id where .... ) B on A.id = B.id
    where B.cc is null or B.cc = 0
Sign In or Register to comment.