PDA

View Full Version : Thêm thứ tự và tính tổng cột?



anaxy
24-11-2007, 17:33
Chào mọi người, tôi có một vấn đề nhỏ sau, mong mọi người giúp đỡ.
Tôi có 1 bảng như sau:


Ten|-So1-|-So2
-A--|-3---|-5
-B--|-7---|-2
-C--|-1---|-9

Bây giờ tôi muốn tạo một bảng khác từ bảng này nhưng có thêm cột Thứ Tự, đồng thời tính tổng 2 cột So1 vá So2



STT|Ten-|-So1-|-So2
-1--|-A---|-3---|-5
-2--|-B---|-7---|-2
-3--|-C---|-1---|-9
----|Tong-|-11--|-16

Xin hỏi làm sao để thêm vào dòng Tổng ở cuối mà không làm STT ở dòng đó tự tăng thành 4.
Và khi thêm một dòng vào bảng 1 thì bảng 2 sẽ tự động thêm STT và các dữ liệu đó vào.

Xin cảm ơn nhiều

malefly
24-11-2007, 22:51
trong "Ét vi eo" thì ko thể làm được cách này đâu. Trừ phi là bạn trình diễn nó dưới dạng là báo cáo (Crystal report hoặc Reporting Services)

anaxy
25-11-2007, 19:10
Vâng, đúng vậy. Tôi chỉ muốn tạo ra một báo cáo in ra dưới dạng bảng như vậy thôi. Nếu anh hoặc ai đó làm được thì giúp tôi nhé

thanhlv84
25-11-2007, 22:18
giả sử cái bảng của bạn có tên là xyz nhé
chạy đoạn code này xem
----------------------
drop table #xyz
create table #xyz (
STT varchar(4),
Ten nvarchar(4) not null,
So1 int,
So2 int)
go
insert #xyz select (select count(*) from xyz as temp where temp.Ten<=xyz.Ten) as STT,* from xyz
go
declare @TSo1 int,@TSo2 int
set @TSo1=(select sum(So1) from xyz)
set @TSo2=(select sum(So2) from xyz)
insert #xyz values ('----','Tong',@TSo1,@TSo2)
go
select * from #xyz
---------------------------------

anaxy
26-11-2007, 02:28
Cám ơn bạn. Phần tính tổng thì mình làm được. Nhưng cột Ten tôi chỉ lấy ví dụ A B C thôi chứ column thật nó không sắp xếp theo vần ABC nên thứ tự bên bảng 2 loạn cả lên so với bảng 1.
Bạn có cách nào khác, ví dụ COUNT(*) FROM XYZ thì được tổng số hàng. Rồi cho STT chạy đến khi bằng số hàng thì nhảy ra INSERT cái Tổng kia vào

thanhlv84
26-11-2007, 13:08
tại vì nó tự động chèn STT theo alphabet nên thành ra bị loạn như vậy,bạn thêm 'order by Ten' hoặc 'order by STT' sau dòng này là được thôi mà
'insert #xyz select (select count(*) from xyz as temp where temp.Ten<=xyz.Ten) as STT,* from xyz order by Ten'
code trên là ngắn gọn nhất rồi

anaxy
26-11-2007, 13:50
Ý mình là Bảng 1 nó không sắp xếp tên theo alphabet , mà trong bảng temp thì nó lại sắp xếp theo alphabet nên tuy STT vẫn tăng tự động nhưng thứ tự các dòng trong bảng 2 không giống như trong bảng 1.
Mình muốn giữ nguyên thứ tự như trong bảng gốc (Không sắp xếp theo alphabet) chỉ muốn chèn thêm một cột STT cho các dòng, trừ dòng tính tổng ở cuối. Bạn có cách nào không, giúp tôi với

thanhlv84
26-11-2007, 16:59
vậy thì ko được đâu bạn àh
theo tôi nghĩ thì khi thiết kế bảng ko ai lại thiết kế với chỉ 1 trường Ten làm khóa như bạn,nếu trong bảng của bạn có 1 trường ID và nó là khóa thì thay vì ta phải lấy field Ten làm điều kiện trong sub query thì dùng field ID sẽ tránh trường hợp đó(tất nhiên field ID bản thân nó đã được sắp xếp theo ASC trong bảng)
tại vì cấu trúc bảng của bạn như vậy nên đành chấp nhận thôi
hoặc có cách khác là can thiệp 1 chút vào cấu trúc bảng
-------
alter table xyz
add ID int identity not null
--------
sau đó insert bình thường vào bảng tạm,insert xong thì dừng và nhảy đến insert tổng khối lượng
cách này đảm bảo các row của bảng ở nguyên vị trí,nhưng bảng sau đó sẽ có thêm 1 field ID tự tăng
chúc thành công !

xbacala
26-11-2007, 21:16
nếu sử dụng SQL 2000 thì đọc bài này:
http://www.databasejournal.com/features/mssql/article.php/10894_2244821_1

Nếu sử dụng SQL 2005 thì thao khảo hàm ROW_NUMBER()

anaxy
27-11-2007, 01:03
Cám ơn thanhlv84 và xbacala. Tôi đang dùng ver2005 nhưng chỉ học theo ver2000 nên không biết nó mới có thêm hàm ROW_NUMBER() tiện lợi thế, có thể giữ nguyên sắp xếp của từng dòng