Giúp em về xử lý với cơ sở dữ liệu
Dear các anh chị,
Tình hình là em có 1 bảng dữ liệu SQL Server:
2900
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 anh chị 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
Chính xác rồi ạ. Em cảm ơn anh nhiều lắm !!! hihi
2901
www.giaiphapexcel.com/diendan/threads/gi%C3%BAp-em-v%E1%BB%81-x%E1%BB%AD-l%C3%BD-v%E1%BB%9Bi-c%C6%A1-s%E1%BB%9F-d%E1%BB%AF-li%E1%BB%87u.134157/
Khóa học SprinGO phù hợp
Khoá học Trưởng phòng nhân sự
Nguồn nhân lực là một trong Tứ trụ kinh doanh của doanh nghiệp, có tác động tới sự tồn tại và phát triển bền...
Xem khóa học
Bạn thử như sau:
@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 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.
Đặ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.
Có thể đây là CSDL đã phân cấp. Tức là có từng bảng điểm chỉ cho 1 năm, 1 học kỳ nào đó. Khi ấy nó càng ít cột càng tốt. Chỉ khác là cột tên thì đáng lẽ phải là mã số. Chứ 500 ngàn thì trùng tên là cái chắc. Nếu CSDL lớn như tôi nghĩ thì đây rất có thể là cái View – tốc độ của view có thể tuỳ thuộc vào tay nghề của admin.
Điểm tôi nhấn mạnh là quản lý CSDL tầm vóc này phải là tay cừ khôi. Mà đã cừ khôi thì phải biết lập một View cho nó pivot bảng ra (tự phản chuẩn). Ở đây chỉ riêng cái yêu cầu đã thấy trình độ sơ khai rồi. Khi dữ liệu có thứ tự và số crosstab có giới hạn thì ngừoi báo cáo khong bao giờ ghép chúng lại mà phải xếp từng cột (đủ 6 cột). Trường hợp ghép chỉ xảy ra khi dữ liệu không có thứ tự hoặc giới hạn.
Tôi nghĩ thớt không phải là quản lý mà chỉ là truy vấn. Nếu đúng trường hợp này thì quy trình chính chắn là nhờ quản lý nó lập cho cái proc, hoặc cái view rồi từ đó mà xài.
Chú: tôi đã nhắc nhiều lần, quản lý cỡ này phải là bậc thầy tôi. Đưa cho tay mơ làm thì đương nhiên báo chí cứ rêu rao mãi tại sao bảng điểm rối lộn tung cả lên.
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.
Đây không phải do "không chuyên lắm về IT". Bởi vì chính dân IT cũng không làm nổi.
Công việc khai thác dữ liệu tích luỹ nhiều năm là công việc của dân… chuyên môn khai thác dữ liệu. Ngừoi ta không nhào vào dùng 1 câu query để lấy báo cáo. Một báo cáo thường được thiết kế và phân tích ngược lại về nguồn dữ liệu và lập query từng giai đoạn. Và công việc thiết kế phải được hoàn chỉnh lại nhiều lần để tiến tới mục đích cuối. Đã nói từ đầu, công việc của bậc thầy tôi mà.
(nhìn cái mẫu báo cáo ở bài #1 tôi đã nghi là sếp dốt rồi. Truy vấn bảng này đáng lẽ phải ra kiểu pivot mới có thể phân tích và tìm hiểu tiếp)