2014-02-20 25 views
0

我有一個缺少行的MYSQL表,並希望查詢以便每週'GROUP'具有相同的行數。查詢將虛擬數據放在缺失的行中

在這個例子中,我需要每個星期我有3天,我想在每個星期的輸出進行進一步的處理相同的天數/行:

week,day,value 
1,1,101 
1,2,102 
1,3,103 
2,1,201 
2,2,202 
3,1,301 
3,2,302 

我想產生這樣的事情 - 每個「周」具有相同的行數。

week,day,value 
1,1,101 
1,2,102 
1,3,103 
2,1,201 
2,2,202 
2,3,NULL 
3,1,301 
3,2,302 
3,3,NULL 

要麼填寫「價值」與零或空值,或者如果丟失一天被設置爲NULL或某事會做 - 甚至一些默認值。行/天的數量總是相同的(在這種情況下爲3),但可能在任何一週中缺失1天或更多天。

我有點難倒如何做到這一點。 將一個左連接到三行1,2,3的表是否可行?

真正的表格比較大,包含所有(周,日)的交叉引用表的手動創建不可行。

謝謝!

CREATE語句

CREATE TABLE `new1` (
    `week` int(11) DEFAULT NULL, 
    `day` int(11) DEFAULT NULL, 
    `value` varchar(45) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

插入語句

INSERT INTO test.new1 
(week, day, value) 
VALUES 
(1,1,101), 
(1,2,102), 
(1,3,103), 
(2, 1, 201), 
(2,2, 202), 
(3, 1, 301), 
(3, 2, 302); 

回答

2

你可以創造一切可能的周/日組合的列表,然後離開加入你現有的表拉過來的值:

SELECT a.*,b.value 
FROM (SELECT * 
     FROM (SELECT DISTINCT week FROM Table1) wk 
      ,(SELECT DISTINCT day FROM Table1) dy 
    )a 
LEFT JOIN Table1 b 
    ON a.week = b.`week` 
    AND a.day = b.`day` 

演示:SQL Fiddle

只需添加填料行:

INSERT INTO Table1 (`week`, `day`, `value`) 
    SELECT a.*,b.value 
    FROM (SELECT * 
      FROM (SELECT DISTINCT week FROM Table1) wk 
       ,(SELECT DISTINCT day FROM Table1) dy 
     )a 
    LEFT JOIN Table1 b 
     ON a.week = b.`week` 
     AND a.day = b.`day` 
    WHERE b.week IS NULL 
+0

啊我一見式留給自己和子查詢JOIN來獲得全套天。這很巧妙! – xcxc

+0

查詢花了很長時間,所以我創建了第二個表,使用每週一天的子查詢。但是,當我LEFT與原始表聯接時,查詢會在600s後超時......我將索引添加到兩個表中一週和一天到兩個,它的作品! (原來的一個是另一個大規模查詢的結果,現在沒有索引了)現在, – xcxc

+0

@xcx很高興聽到它,如果經常這樣做,絕對值得創建一個永久的'驅動程序'表,它具有所有的組合這是你的追求。 –