PDA

View Full Version : Cần giúp về select dữ liệu 1 bảng theo điều kiện..



vietlong90
04-04-2012, 09:13
Mình có 1 bảng câu hỏi, gồm có:
ID | Tên câu hỏi | Điểm

điểm thì mình tự nhập, dao động từ 2~5 điểm,
mình muốn select ra các câu hỏi sao cho tổng điểm các câu hỏi là 30 điểm, sao cho mỗi lần select nó ra 1 danh sách các dòng khác nhau, tổng số câu hỏi tùy thuộc vào điểm của các câu bên trong
Mình có thể sắp xếp random theo Guid, nhưng ko biết làm thế nào để lấy ra các câu hỏi thỏa mãn điều kiện trên..
ai giúp với??

dunga6
04-04-2012, 15:56
thế sao không thấy column tổng điểm bạn ơi?
vì tổng điểm tính theo các câu hỏi mà!

mrPhanThanh
04-04-2012, 23:17
Trên bảng câu hỏi bạn thêm 1 cột stt kiểu dữ liệu int: đánh số từ 1 .. 100 (100 là tổng số dòng của bảng câu hỏi).
Bạn viết store procedure select kết quả như fle sau:12012


CREATE PROCEDURE TaoDeThi
AS
BEGIN
SET NOCOUNT ON

DECLARE _i INT, _Max_Try INT
DECLARE _Random INT, _Upper INT, _Lower INT
DECLARE _TongDiem INT, _Tong INT

SET _i = 0
SET _Max_Try = 1000 --Tránh lặp vô hạn
SET _Lower = 1 -- Giá trị nhỏ nhất
SET _Upper = 100 -- Giá trị lớn nhất = tổng số câu hỏi của bảng điểm


CREATE TABLE #tmp(Stt INT NULL, Cau_Hoi NVARCHAR(4000) NULL, DIEM INT NULL) --Tạo bảng chứa kết quả

SET _TongDiem = 0
WHILE (_TongDiem < 29 AND _i < _Max_Try )
BEGIN
SET _Random = ROUND(((_Upper + _Lower) * RAND() + _Lower), 0)
SELECT Stt, Cau_Hoi, Diem INTO #tmp2 FROM BangCauHoi
WHERE Stt = _Random AND Stt NOT IN (select Stt from #tmp)

IF (__ROWCOUNT = 1)
BEGIN
SELECT _Tong = _TongDiem + Diem FROM #tmp2
IF (_Tong = 30) --Đã đủ 30
BEGIN
INSERT INTO #tmp(Stt, Cau_Hoi, Diem)
SELECT Stt, Cau_Hoi, Diem FROM #tmp2
BREAK
END
ELSE
BEGIN
IF (_Tong < 29) --Nếu 29 điểm thì chết vì mỗi câu từ 2->5 điểm (không tìm ra câu 1 điểm được)
BEGIN
INSERT INTO #tmp(Stt, Cau_Hoi, Diem)
SELECT Stt, Cau_Hoi, Diem FROM #tmp2
SET _TongDiem = _Tong
END
END
END

drop table #tmp2
SET _i = _i + 1
END

SELECT * FROM #tmp
END

p/s: hic nội dung store procedure có ký tự a còng không post được nên thay bằng dấu _