2011-03-14 68 views
3

我試圖在一個SQL查詢中收集統計數據,以方便日期在聯合中自動排序。它實際上只有一個表格,但我想要統計不同的數據。MySQL - 聯盟還是加入?

我的表看起來是這樣的:

ID In   Wanted 
441 2011-03-14 0 
439 2011-03-14 1 
442 2011-03-14 0 
428 2011-03-13 1 
431 2011-03-13 1 
425 2011-03-11 0 
423 2011-03-11 1 
420 2011-03-09 1 

我親近與此查詢所期望的結果:

SELECT * FROM 
(
    (SELECT date(In) n, count(date(In)) cntw, null cntl FROM items i WHERE Wanted=1 group by date(In)) 
union all 
    (SELECT date(In) n, null cntw, count(date(In)) cntl FROM items i WHERE Wanted=0 group by date(In)) 
) Serie 
Order by n DESC 

但一位接近不夠緊密:d結果我得到的是這樣的:

n   cntw cntl 
2011-03-14 null 2 
2011-03-14 1  null 
2011-03-13 2  null 
2011-03-11 null 1 
2011-03-11 1  null 
2011-03-09 1  null 

我想要的是「混合」結果在同一行上,按日期:

n   cntw cntl 
2011-03-14 1  2 
2011-03-13 2  null 
2011-03-11 1  1 
2011-03-09 1  null 

正如你所看到的,每個日期只有一行。 其實最完美的結果將是,即使缺少的日期在那裏了:

n   cntw cntl 
2011-03-14 1  2 
2011-03-13 2  null 
2011-03-12 null null 
2011-03-11 1  1 
2011-03-10 null null 
2011-03-09 1  null 

...但我想這是不可能的。

謝謝!

+0

你應該避免在你的字段名稱中使用MySQL關鍵字(我的意思是「In」字段)。關於問題:不可能以某種方式使用「GROUP BY」? – galymzhan 2011-03-14 15:06:55

+0

嗯,名字實際上是'CheckIn',表格比我在這裏展示的要複雜得多,我在我的例子中縮短了它。 – 2011-03-16 00:34:25

回答

3
select date(In) as n, 
     sum(case when wanted = 1 then 1 else 0 end) as cntw, 
     sum(case when wanted = 0 then 1 else 0 end) as cntl 
    from items 
    group by date(In) 
    order by n desc 
+0

實際上,當玩弄一下時,您的解決方案是最靈活的解決方案,而且我無需理解t語法就可以理解它:DI設法爲您的應用程序添加更多高級選項模型。 – 2011-03-14 15:56:07

1

你想加入他們的行列,我認爲這會工作

SELECT * FROM 
    (SELECT date(In) n, count(date(In)) cntw, null cntl FROM items i WHERE Wanted=1 group by date(In)) as a 
LEFT JOIN 
    (SELECT date(In) n, null cntw, count(date(In)) cntl FROM items i WHERE Wanted=0 group by date(In)) as b 
ON a.n = b.n 
Order by n DESC 

但我認爲這可以在一個單一的查詢來完成,像這樣的吧?

CREATE TABLE #tmpFoo (
    SomeDate datetime, 
    Wanted bit 
) 

INSERT INTO #tmpFoo VALUES ('2011-03-11', 0) 
INSERT INTO #tmpFoo VALUES ('2011-03-11', 1) 
INSERT INTO #tmpFoo VALUES ('2011-03-12', 0) 
INSERT INTO #tmpFoo VALUES ('2011-03-12', 1) 
INSERT INTO #tmpFoo VALUES ('2011-03-14', 0) 

SELECT SomeDate n, 
     count(NULLIF(Wanted,0)) cntw, 
     count(NULLIF(Wanted,1)) cntl 
    FROM #tmpFoo i 
    GROUP BY SomeDate 
+0

我會'使用(N)'而不是'ON a.n = b.n'。 – Romain 2011-03-14 15:04:23

+0

@Romain,我不喜歡那種方法,我用一個更簡單,單一的,沒有子查詢的解決方案添加到我的答案中 – CaffGeek 2011-03-14 15:12:49

+0

+ 1v謝謝!它充當魅力!我使用USING(n)版本(來自Romain)而不是ON a.n = b.n.現在我會坐下來分析你做了什麼,這樣我可以學習這是如何工作的:) – 2011-03-14 15:18:01

1

你會使用一個LEFT JOIN使用n場得到,你有東西的日期......那麼你最好UNION這與查詢,讓您在那裏沒有什麼(你給的信息行以上不允許我幫助這將是什麼查詢:D)。

+0

對於USING(n)建議:) +1 – 2011-03-14 15:18:52