Re: [SQL ] 算10題相加平均值
我已經有站內信給過原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)
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):