2016-02-05 92 views
0

當我使用以下公式運行單個查詢以使第一列回饋月/年時,第二個回報每月簽署的人數,第三個回饋給運行總計簽名的,它的偉大工程:MySQL:來自不同子查詢的多個運行總計

SET @runtot1:=0; 
SELECT 
    1rt.MONTH, 
    1rt.1signed, 
    (@runtot1 := @runtot1 + 1rt.1signed) AS 1rt 
FROM 
    (SELECT 
     DATE_FORMAT(STR_TO_DATE(s.datecontacted,'%m/%d/%Y'),'%Y-%m') AS MONTH, 
     IFNULL(COUNT(DISTINCT CASE WHEN s.surveyid = 791796 THEN s.id ELSE NULL END),0) AS 1signed 
    FROM table1 s 
    JOIN table2 m ON s.id = m.id AND m.current = "Yes" 
    WHERE STR_TO_DATE(s.datecontacted,'%m/%d/%Y') > '2015-03-01' 
    GROUP BY MONTH 
    ORDER BY MONTH) AS 1rt 

有了上面的查詢,我得到的結果如下表,這將是我想要的東西,如果我只需要算一兩件事:

MONTH 1signed 1rt 
2015-03 0  0 
2015-04 1  1 
2015-05 0  1 
2015-08 1  2 
2015-10 1  3 
2015-11 1  4 
2016-01 0  4 
2016-02 0  4 

但我不知道如何做到這一點與多個子查詢si我需要在多個列同時發生這種情況。例如,我試圖這樣的事情(which doesn't work):

SET @runtot1:=0; 
SET @runtot2:=0; 
select 
    DATE_FORMAT(STR_TO_DATE(s1.datecontacted,'%m/%d/%Y'),'%Y-%m') AS MONTH, 
    t1.1signed, 
    (@runtot1 := @runtot1 + t1.1signed) AS 1rt, 
    t2.2signed, 
    (@runtot2 := @runtot2 + t2.2signed) AS 2rt 
from 
    (select 
    DATE_FORMAT(STR_TO_DATE(s.datecontacted,'%m/%d/%Y'),'%Y-%m') AS MONTH, 
    IFNULL(COUNT(DISTINCT CASE WHEN s.surveyid = 791796 THEN s.id ELSE NULL END),0) AS 1signed 
    from table1 s 
    left join table2 m ON m.id = s.id 
    where m.current = "Yes" 
    GROUP BY MONTH 
    ORDER BY MONTH) as T1, 
    (select 
    DATE_FORMAT(STR_TO_DATE(s.datecontacted,'%m/%d/%Y'),'%Y-%m') AS MONTH, 
    IFNULL(COUNT(DISTINCT CASE WHEN s.surveyid = 846346 THEN s.id ELSE NULL END),0) AS 2signed 
    from table1 s 
    left join table2 m ON m.id = s.id 
    where m.current = "Yes" 
    GROUP BY MONTH 
    ORDER BY MONTH) as T2, 
    table1 s1 
LEFT JOIN table2 m1 ON m1.id = s1.id AND m1.current = "Yes" 
WHERE STR_TO_DATE(s1.datecontacted,'%m/%d/%Y') > '2015-03-01' 
GROUP BY DATE_FORMAT(STR_TO_DATE(s1.datecontacted,'%m/%d/%Y'),'%Y-%m') 
ORDER BY DATE_FORMAT(STR_TO_DATE(s1.datecontacted,'%m/%d/%Y'),'%Y-%m') 

這嚴重炸燬了我的結果 - 我也試圖LEFT JOIN的讓這兩個下一對方,但也不能工作。

這裏有一個SQL Fiddle帶有幾個值與查詢頂部的工作,但不是查詢需要看起來像下面的想法。

如果代碼的多個子查詢版本的工作,下面將是理想的歸宿:

MONTH 1signed 1rt 2signed 2rt 
2015-03 0  0 1  1 
2015-04 1  1 0  1 
2015-05 0  1 1  2 
2015-08 1  2 0  2 
2015-10 1  3 0  2 
2015-11 1  4 0  2 
2016-01 0  4 0  2 
2016-02 0  4 1  3 

只是試圖找出一種方式來獲得每月連軋總計數自2015年3月兩使用相同查詢的不同調查問題。任何幫助將不勝感激!

+0

@Strawberry對不起 - 我添加了一些他們的樣子。我希望這有助於! – Ryan

+0

讓我們[在聊天中繼續討論](http://chat.stackoverflow.com/rooms/102735/discussion-between-ryan-and-strawberry)。 – Ryan

+0

因此,回顧一下,鑑於更新sqlfiddle中提供的數據集以及更新的sqlfiddle中提供的數據集,期望的結果集應該是什麼樣子? – Strawberry

回答

0

看來你這樣的事情之後是......

數據集:

DROP TABLE IF EXISTS table1; 

CREATE TABLE table1 
(id INT NOT NULL 
, date_contacted DATE NOT NULL 
, survey_id INT NOT NULL 
, PRIMARY KEY(id,survey_id) 
); 

DROP TABLE IF EXISTS table2; 

CREATE TABLE table2 
(id INT NOT NULL PRIMARY KEY 
,is_current TINYINT NOT NULL DEFAULT 0 
); 

INSERT INTO table1 VALUES 
(1,"2015-03-05",846346), 
(2,"2015-04-15",791796), 
(2,"2015-05-04",846346), 
(3,"2015-06-07",791796), 
(3,"2015-06-08",846346), 
(4,"2015-08-02",791796), 
(5,"2015-10-15",791796), 
(6,"2015-11-25",791796), 
(6,"2016-01-02", 11235), 
(6,"2016-02-06",846346); 

INSERT INTO table2 (id,is_current) VALUES 
(1,1), 
(2,1), 
(3,0), 
(4,1), 
(5,1), 
(6,1); 

查詢:

SELECT x.* 
    , @a:[email protected]+a rt_a 
    , @b:[email protected]+b rt_b 
    FROM 
    (SELECT DATE_FORMAT(date_contacted,'%Y-%m') month 
      , SUM(survey_id = 791796) a 
      , SUM(survey_id = 846346) b 
     FROM table1 x 
     JOIN table2 y 
      ON y.id = x.id 
     WHERE y.is_current = 1 
     GROUP 
      BY month 
    ) x 
    JOIN (SELECT @a:=0,@b:=0) vars 
ORDER 
    BY month; 
+---------+------+------+------+------+ 
| month | a | b | rt_a | rt_b | 
+---------+------+------+------+------+ 
| 2015-03 | 0 | 1 | 0 | 1 | 
| 2015-04 | 1 | 0 | 1 | 1 | 
| 2015-05 | 0 | 1 | 1 | 2 | 
| 2015-08 | 1 | 0 | 2 | 2 | 
| 2015-10 | 1 | 0 | 3 | 2 | 
| 2015-11 | 1 | 0 | 4 | 2 | 
| 2016-01 | 0 | 0 | 4 | 2 | 
| 2016-02 | 0 | 1 | 4 | 3 | 
+---------+------+------+------+------+ 
1

你嘗試竟是八九不離十。我剛剛擺脫了S1的並加入了兩個子查詢一起在他們的MONTH列:

SET @runtot1:=0; 
SET @runtot2:=0; 
select 
    T1.MONTH, 
    t1.1signed, 
    (@runtot1 := @runtot1 + t1.1signed) AS 1rt, 
    t2.2signed, 
    (@runtot2 := @runtot2 + t2.2signed) AS 2rt 
from 
    (select 
    DATE_FORMAT(STR_TO_DATE(s.datecontacted,'%m/%d/%Y'),'%Y-%m') AS MONTH, 
    IFNULL(COUNT(DISTINCT CASE WHEN s.surveyid = 791796 THEN s.id ELSE NULL END),0) AS 1signed 
    from table1 s 
    left join table2 m ON m.id = s.id 
    where m.current = "Yes" and STR_TO_DATE(s.datecontacted,'%m/%d/%Y') > '2015-03-01' 
    GROUP BY MONTH 
    ORDER BY MONTH) as T1, 
    (select 
    DATE_FORMAT(STR_TO_DATE(s.datecontacted,'%m/%d/%Y'),'%Y-%m') AS MONTH, 
    IFNULL(COUNT(DISTINCT CASE WHEN s.surveyid = 846346 THEN s.id ELSE NULL END),0) AS 2signed 
    from table1 s 
    left join table2 m ON m.id = s.id 
    where m.current = "Yes" and STR_TO_DATE(s.datecontacted,'%m/%d/%Y') > '2015-03-01' 
    GROUP BY MONTH 
    ORDER BY MONTH) as T2 
WHERE 
T1.MONTH=T2.MONTH 
GROUP BY T1.MONTH 
ORDER BY T1.MONTH 

我沒有測試過草莓的解決方案,它看起來更優雅。但我想你想知道你的方法(單獨解決跑步總數,然後一起加入結果)也會起作用。