2014-03-13 64 views
0

這是我的表格結構和數據。如何在mysql中使用聚合函數將值賦給變量?

create table StudentInformation 
(
    sId INT(5), 
    name VARCHAR(50), 
    sClass VARCHAR(10), 
    maths INT(5), 
    physics INT(5), 
    chemistry INT(5) 
); 

INSERT INTO StudentInformation 
values 
(1, 'Jai', '11th', 60, 75, 65), 
(2, 'Leela', '12th', 91, 87, 94), 
(3, 'Suresh', '11th', 75, 68, 70), 
(4, 'Ramesh', '11th', 50, 67, 55), 
(5, 'Janki', '12th', 78, 89, 78), 
(6, 'Lalu', '12th', 30, 38, 45), 
(7, 'Amit', '11th', 91, 95, 93), 
(8, 'Komal', '11th', 66, 78, 74), 
(9, 'Sanjay', '12th', 25, 40, 35); 

現在我想計算每班的平均分數。
我曾嘗試此查詢:

SELECT 
sClass class, 
@var := sum(maths+physics+chemistry)/(count(sid)*3) as avgMarksPerSubject, 
@var as variableValue, 
count(sid) as numberOfStudents 
FROM StudentInformation 
#where @var > 65 
group by sClass; 

使用變量是強制性這裏這只是我的實際任務的例子。
現在我想擁有超過65分的記錄。
WHERE從句中使用變量可能嗎?
我沒有得到@var的實際數據,我怎樣才能在WHERE條款中使用它?
你可以試試sql查詢here
有什麼建議嗎?
由於

+0

有一個名爲@var將與所有行共享一個變量,所以第一行的值將被隨後的行值覆蓋。進一步的WHERE子句將在聚合函數執行之前發生(將其改爲HAVING avgMarksPerSubject> 65)。 – Kickstart

+0

這意味着我不能在這種情況下使用變量,對吧? – unknown

+0

不,你不是。它們可以用於將一行中的值傳遞給下一行,並將其分配給SELECT中的某個字段,但每次將其分配給該變量本身時都會被寫入。使用變量來獲得你想要的結果是完全沒有必要的。你真正的需求是什麼使變量具有強制性? – Kickstart

回答

1

使用一個用戶定義的會議where子句變量是唯一可能的,當它是預初始化。除非另有說明,否則由於SQL-Query-Order-of-Operations,變量將具有默認值NULL,並且該條件可能不符合預期的結果。

set @var:=0; 

SELECT 
     sClass class, 
     @var := cast(sum(maths+physics+chemistry) 
        /(count(sid)*3) as decimal(6,2) 
      ) as avgMarksPerSubject, 
     @var as variableValue, 
     count(sid) as numberOfStudents 
FROM StudentInformation 
where @var < 65 
group by sClass 
; 

+-------+--------------------+---------------+------------------+ 
| CLASS | AVGMARKSPERSUBJECT | VARIABLEVALUE | NUMBEROFSTUDENTS | 
+-------+--------------------+---------------+------------------+ 
| 11th |    72.13 |    0 |    5 | 
| 12th |    60.83 |    0 |    4 | 
+-------+--------------------+---------------+------------------+ 

在這裏可以清楚地看到,該變量不每行並從上一列表達式計算的值分配的任何值。

你可以看到通過運行下面的查詢其副作用:

select * from (
    SELECT 
     sClass class, 
     @var := cast(sum(maths+physics+chemistry) 
        /(count(sid)*3) as decimal(6,2) 
      ) as avgMarksPerSubject, 
     @var as variableValue, 
     count(sid) as numberOfStudents 
    FROM StudentInformation 
    group by sClass 
) r where avgMarksPerSubject > 65 

+-------+--------------------+---------------+------------------+ 
| CLASS | AVGMARKSPERSUBJECT | VARIABLEVALUE | NUMBEROFSTUDENTS | 
+-------+--------------------+---------------+------------------+ 
| 11th |    72.13 |   60.83 |    5 | 
+-------+--------------------+---------------+------------------+ 

@SQL Fiddle

+0

我很感謝你的建議,但是在刪除where子句後,我得到了相同的值 - @var或(variableValue) - 爲每個類。看看這個 - http://sqlfiddle.com/#!2/bfde9/48 – unknown

+1

是的。請通讀建議的[* SQL-Query-Order-of-Operations *](http://www.bennadel。70-SQL查詢,訂單的-Operations.htm)的COM /博客/。早先的結果是因爲「在哪裏」的存在並首先被執行。 –

+0

查看查詢的不同行爲。 http://sqlfiddle.com/#!2/bfde9/53你能解釋一下嗎? – unknown