Re: [SQL ] 算10題相加平均值

看板Database作者 (Mark)時間13年前 (2010/11/10 00:47), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
我已經有站內信給過原PO,但我想要寫出來 看看大家覺得我的思考的方向是否有錯誤 DBMS: MSSQL 就像小弟說的那樣,把Tuple(列)變成一個欄位,目前是沒有看過篩選條件 是可以把不要的欄位去掉,通常你看到結構語法都是 Select [想要呈現的欄位] From [資料來源的關聯表] Where [篩選出你符合條件的紀錄(列)] 所以我才說,你要把一個Tuple(列)變成一欄,這樣子 才有辦法去篩選出不是1的資料總共有幾個題目,才有辦法去作平均的運算 當然這方法最好是用Function去算,丟給他每一筆紀錄的PK然後讓他去轉置成欄 再去作運算並且丟回值,這是我目前想到的方式. example: 目前資料的表格如下 IdentifyID ,Q1 ,Q2 ,Q3 ..... ,Q10 , AVG 1 1 1 2 3 2 2 3 1 1 3 3 2 2 1 4 2 1 1 1 5 3 5 2 1 . . . . --------------------------------------------- 然後在Avg的欄位繫結Function Function的結構大概如下 CREATE FUNCTION ClacAvg @ID AS INT AS DECLART @tmpTable TABLE(Score AS INT) DECLART @AVG AS INT DECLART @Q1 AS INT DECLART @Q2 AS INT . . . DECLART @Q10 AS INT SELECT @Q1 = Q1, @Q2 = Q2 , .... @Q10 = Q10 FROM 問卷一 WHERE IdentifyID = @ID INSERT @tmpTable VALUES (@Q1),(@Q2),(@Q3)....(@Q10) SELECT @AVG = AVG(Score) FROM @tmpTable WHERE Score > 1 RETURNS @AVG 大概是這樣,我沒有弄在資料庫去跑,如果有bug你可能要小抓一下 觀念上就是我說的把一列轉成一行,才有辦法篩選出不是1的個數在平均 不用Function的話,那如果你有一百筆紀錄,那你UPDATE指令就要下一百次 所以直接繫結在欄位上,給他該列的id讓他自己去算,這樣會比較有效率. ※ 引述《athelok (連米)》之銘言: : 用總數 3 個欄位當範例 10 個欄位請依此類推: : 資料表名 tb,3個欄位分別為c1 c2 c3、平均欄位名avg_column : update tb set tb.avg_column = : IFNULL( : (IF(tb.c1 = 1, 0, tb.c1) + IF(tb.c2 = 1, 0, tb.c2) + IF(tb.c3 = 1, 0, tb.c3)) : / : (3 - (IF(tb.c1 = 1, 1, 0)) - (IF(tb.c2 = 1, 1, 0)) - (IF(tb.c3 = 1, 1, 0))) : , 0) : 對了 資料庫是MYSQL, 目前想到的就這樣, 還有其他大大有更好的做法嗎? : ※ 引述《bkk (.....)》之銘言: : : 目前在做一個問卷分數的計算 : : 問卷一共有10題 分數個別是 : : 非常不滿意:1 : : 不滿意:2 : : 尚可:3 : : 滿意:4 : : 非常滿意:5 : : 資料庫欄位則有題目1到題目10以及平均分數 : : 我現在想要把10題的分數加起來後算平均值 : : 目前的SQL語法如下 : : UPDATE dbo.Q_問卷一 set 平均分數 = : : (題目1+ 題目2+題目3+題目4+題目5+題目6+題目7+題目8+題目9+題目10)/10 : : 問題來了 現在我要把分數為1的題目去掉 不納入平均值計算 : : 例如:題目1為1 那平均分數就是 (題目2+到題目10)/9 : : 題目1跟2為1 那平均分數就是 (題目3+到題目10)/8 : : 我有認真想過 不過實在是沒概念 : : 我甚至想說用土法煉鋼的方式 寫好幾百種當題目x=1的條件去判斷(實在是蠢的可以= =) : : 拜託大家幫個忙了 感謝!!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.227.228.61 ※ 編輯: yumark 來自: 125.227.228.61 (11/10 00:48)
文章代碼(AID): #1CsNiBw- (Database)
文章代碼(AID): #1CsNiBw- (Database)