2016-08-20 57 views
0

我堅持努力做計算的SQL查詢。我有臺出席,看起來像這樣:在MySQL查詢執行復雜的計算

roll | sub_id | status 
abc |  1 | 1 
abc |  1 | 0 
abc |  2 | 1 
xcv |  1 | 1 
abc |  2 | 1 
abc |  1 | 1 
lkj |  2 | 0 

這是我的表受到的例子:

id | name 
1 | Data Structure 
2 | Cloud Computing 

我想選擇特定的卷不同sub_id,然後用0開始計數的狀態數和狀態1並鏈接到主題表並顯示其名稱。 我想要這樣的東西:

roll | sub_id |  name  | status with 0 | status with 1 
abc | 1 |Data Structure |  1  |  2 
abc | 2 |Cloud Computing |  0  |  2 

有人可以解釋我嗎? 我該如何處理查詢?

回答

0

你可以這樣做:

SELECT 
    a.roll, 
    a.sub_id, 
    b.name, 
    SUM(Case when status=0 then 1 else 0 end) as 'status with 0', 
    SUM(Case when status=1 then 1 else 0 end) as 'status with 1' 
FROM 
    myTable a inner join subject b on 
    a.sub_id = b.id 
    group by a.roll, a.sub_id; 

我做了一個搗鼓你:http://sqlfiddle.com/#!9/23d1d9/11/0

+0

謝謝!好的方法。 –

+0

這種方法存在一個問題:查詢選擇了一個非聚合列('b.name'),它沒有出現在GROUP BY子句中,並且在所有情況下都可能不會給出正確的結果。這個查詢甚至不會運行在Oracle,SQL Server和MySQL以外的任何數據庫中。 –

+0

我同意@TimBiegeleisen。它不會用完5.7 – Drew

3

可以使用條件聚集樞軸查詢來獲取你想要的輸出。下面的子查詢計算吻合爲status當該值既01,對於每個各roll/sub_id基。

SELECT t1.roll, 
     t1.sub_id, 
     COALESCE(t2.name, 'name is NA'), 
     t1.`status with 0`, 
     t1.`status with 1` 
FROM 
(
    SELECT roll, 
      sub_id, 
      SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END) AS `status with 0`, 
      SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS `status with 1` 
    FROM attendance 
    GROUP BY roll, 
      sub_id 
) t1 
LEFT JOIN 
subject t2 
    ON t1.sub_id = t2.id 

按照下面的運行演示的鏈接:

SQLFiddle

+0

它在主題t2附近給出語法錯誤 ( 選擇的是捲筒紙 sub_id, –

+0

這看起來非常複雜的查詢。沒有更簡單的方法嗎? –

+0

@TomCruise這個查詢確實不是那麼複雜。 –