Lần chỉnh sửa cuối:
Dear các anh chị,
...
Em rất mong được các cao thủ chỉ giáo..
Thử thế này coiDear các anh chị,
Tình hình là em có 1 bảng dữ liệu SQL Server:
View attachment 193458
Giờ em muốn thực hiện câu lệnh query để có được bảng kết quả là điểm của từng lần thi mà tìm mãi không ra cách.
Hoặc thực hiện lập trình trên VBA ở Excel cũng được.
Em rất mong được các cao thủ chỉ giáo..
Em xin cám ơn!
Thử thế này coi
SELECT DISTINCT A.TEN,
SUBSTRING(
(
SELECT '-' + CAST(B.DIEM AS NVARCHAR(5)) AS [TEXT()]
FROM BANGDIEM B WHERE B.TEN = A.TEN
ORDER BY B.TEN
FOR XML PATH ('')
), 2, 100) AS DIEM_CAC_LAN
FROM BANGDIEM A
Sửa lại các từ trên thì tôi sẽ nói chuyện tiếp.
(nếu không biết sửa như thế nào thì cứ tưởng tượng bạn đang viết văn bản đưa cho sếp ký)
Chú: diễn đàn này cũng có nhiều người giỏi về T-SQL. Chịu khó chờ cũng chả sao.
Bạn thử như sau:
SELECT DISTINCT Ten, stuff
((SELECT ' - ' + CONVERT(VARCHAR(50), DiemCacLan, 128)
FROM tblBangDiem t1
WHERE t1.Ten = t2.Ten FOR XML PATH('')), 1, 2, '') AS DiemCacLan
FROM tblBangDiem t2
Cảm ơn anh, cái XML này em không rành lắm.@quanluu1989:
[text()] là cái từ khoá đặc biệt báo cho XML builder biết rằng cột này là cột không có tên. Nếu không có ký hiệu này, và cột lấy ra từ một trường nguyên thủy, XML builder sẽ dùng tên trường để tạo thẻ bọc dữ liệu <Diem>4</Diem>
Ở bài này, vì cột là con toán cộng dấu trừ ('-') nên tự nó đã không có tên rồi.
Nói cách khác, trường hợp này, bạn có thể bỏ đi từ "AS [text()]".
Chú thích 1: ngừoi ta chỉ truy vấn gộp cột khi các cột không tương ứng với nhau. Ở bài này, các điểm thực ra có thứ tự rõ rệt, lần 1, lần 2... và có giới hạn số (không lẽ thi 10 lần?)
Trình bày theo kiểu pivot mới là đúng phương pháp báo cáo.
Chú thích 2: vì trường hợp này đặc biệt là các dòng có thứ tự rõ rệt cho nên cũng có thể dùng câu truy vấn CASE WHEN.
Bạn chạy ở môi trường Database nào, hay Excelem lại phát sinh vấn đề là.. database của em lớn quá, 3 triệu dòng, mà mỗi học sinh thi lại đến tận 5, 6 lần liền. em chạy query 4 tiếng 20p rồi mà nó chưa xong.. các anh có cách nào để database chạy nhanh hơn được không ạ??
Em xin cám ơn nhiều !!!!
em lại phát sinh vấn đề là.. database của em lớn quá, 3 triệu dòng, mà mỗi học sinh thi lại đến tận 5, 6 lần liền. em chạy query 4 tiếng 20p rồi mà nó chưa xong.. các anh có cách nào để database chạy nhanh hơn được không ạ??
Em xin cám ơn nhiều !!!!
Bạn chạy ở môi trường Database nào, hay Excel
Nếu là SQL Server thì đâu chậm thế, và cứ từ từ ngủ 1 giấc , sáng mai xong cũng được.
Ước lượng: 3 triệu / 6 lần thi = 500.000 học sinh.
Thứ nhất: với SQL Server thì vài triệu chả có nghĩa lý gì.
Thứ hai: để quản lý 500.000 học sinh thì cái CSDL khá phức tạp.
Chả có một trường nào có đến con số này. Họa may là tổ hợp của nhiều trường. Consolidated Database là công việc rất cao cấp. Nếu bạn đã lên đây hỏi là chắc chắn nó nằm ngoài khả năng của bạn. Về bảo sếp cơ quan tìm chuyên viên thôi.
em lại phát sinh vấn đề là.. database của em lớn quá, 3 triệu dòng, mà mỗi học sinh thi lại đến tận 5, 6 lần liền. em chạy query 4 tiếng 20p rồi mà nó chưa xong.. các anh có cách nào để database chạy nhanh hơn được không ạ??
Em xin cám ơn nhiều !!!!
Truy vấn như các đề nghị ở trên không đến nỗi tệ đâu bạn, và chắc không thể kéo dài vài tiếng như bạn nói, trừ khi máy chủ quá yếu hoặc phiên bản SQL server là bản miễn phí.
Bạn có thể thử với từ khóa PIVOT SQL SERVER google xem sao, nếu vẫn chậm thì ta sẽ phải tính cách khác, có thể phải sử dụng Procedure
Đặt một cái cấu trúc tạm cho XML với 3 triệu tags, 500.000 roots là SQL Server Express chết chắc.
Mặt khác, với Server trả tiền thì không nghĩa lý gì. Nếu chậm là do đường dẫn và hạ tầng. Nhưng nếu do hạ tầng thì Procedure chả giúp ích gì.
1. Khi số records lên đến triệu thì SSE quên đi. Bắt buộc phải mua bản quyền.
2. Khi số học sinh cần quản lý lên đến gần chục ngàn thì ngừoi quản lý phải nhiều kinh nghiệm, hoặc ít nhất học qua khoá đào tạo chuyên nghiệp. Ở đây đến nửa triệu học sinh, 50 lần con số giới hạn trên. Nói thật, cỡ này là bậc thầy tôi.
3. Khi CSDL lớn đến thế thì có rất nhiều lý do để chạy chậm và có rất nhiều chỗ để cải tiến. Một vấn đề có thể cả tháng mới giải quyết xong, và phải làm trực tiếp. Ngừoi ta chỉ hỏi những chỗ bí. Hỏi đại trà trên diễn đàn là mò trăng đáy nước.
Em không nghĩ số học sinh đến mức 500 000. Đó là số học sinh của cả 1 tỉnh chứ đâu phải 1 trường.
Cái này không chắc. Chỉ là đoán mò thôi. Người hỏi chỉ muốn nhấn mạnh vào vấn đề ghép điểm để đưa lên xem, nên lược bớt các vấn đề liên quan cho dễ hình dung.
Chứ bảng dữ liệu làm sao chỉ có vài cột được. Điểm môn gì ? 1 tiết hay học kỳ ? học kỳ nào ? năm nào ? chỉ nội những thuộc tính cơ bản đó cho vài nghìn học sinh là đủ tới vài triệu dòng dữ liệu rồi. Ở đây chúng ta chỉ đưa ra các hướng giải quyết chứ không cụ thể được. Có giải quyết được không tùy vào trình độ và kinh nghiệm của người quản lý CSDL thôi.
Em cám ơn các bác.
Để trả lời thắc mắc tại sao database lớn thế vì dữ liệu này là của 20 năm kết hợp lại, cứ tích lũy dần dần nên nó lớn như vậy. Còn làm cái kia là sếp em yêu cầu ạ..
Bên em lại ko có máy chủ, chỉ có SQL Server bản quyền nhưng chạy trên .. laptop Thinkpad T430 và Desktop nên phần cứng ko được mạnh như server.
Em lại không chuyên lắm về IT nên cũng muốn học hỏi!!
Phân tích 20 năm dữ liệu thì mất vài ngày là chuyện thường. Mới có mấy tiếng đồng hồ mà đã than chậm.