QUẢN LÝ DỰ ÁN Câu 1: Viết Trigger đbảo mỗi nhviên chỉ thhiện 1 d.án Create Trigger Cau1 ON Phan_cong FOR Insert, Update AS if exists (select * from Inserted where manv in ( select distinct manv from Phan_cong ) ) Begin Raiserror('Mot nhvien ko the thgia nhieu d.án',16,1) Rollback tran End Câu 2: Viết Trigger đbảo một d.án đbảo chỉ t.đa 5 nhviên Create Trigger Cau2 ON Phan_cong FOR Insert, Update AS if exists (select * from Inserted where manv in ( select manv from Phan_cong group by manv having count(manv)=6 ) ) Begin Raiserror('Mot d.án ko thể quá 5 nhviên',16,1) Rollback tran End Câu 3: Viết Trigger đbảo ngày kthúc luôn >= ngày bđầu dự án Create Trigger Cau3 ON Du_an FOR Insert, Update AS if exists (select * from Inserted where ngayketthuc < ngaybatdau ) Begin Raiserror('Loi xay ra', 16, 1) Rollback tran End Câu 4: Viết Trigger đbảo nhviên nếu là trưởng phòng thì ko đc tham gia vào bkì d.án nào. Create Trigger Cau4 ON Phan_cong FOR Insert, Update AS if exists (select * from Inserted where manv in ( select distinct matp from Phong_ban
) ) Begin Raiserror('Loi xay ra',16,1) Rollback tran End Câu 5: Viết Trigger đ.bảo một d.án ko thể kéo dài quá 10 ngày Create Trigger Cau5 ON Du_an FOR Insert, Update AS if exists (select * from Inserted where ngayketthuc-ngaybatdau>10 ) Begin Raiserror('Loi xay ra',16,1) Rollback tran End Câu 6: Viết Trigger đ.bảo bkì d.án nào cũng phải có ít nhất 1 tr.phòng thgia Create Trigger Cau6 on Phan_cong for Insert, Update As if exists (select * from Inserted where manv in (select distinct matp from Phong_ban group by matp having count(matp)>=1) ) begin raiserror('loi',16,1) rollback tran end Câu 7: Viết Trigger đ.bảo khi có 1 d.án chưa h.thành thì ko đc có thêm d.án khác. Create Trigger Cau7 ON Du_an FOR Insert, Update AS if exists (select * from Inserted where ngaybatdau < any( select ngayketthuc from Du_an ) ) Begin Raiserror('Loi xay ra',16,1) Rollback tran End Câu 8: Viết Trigger đ.bảo 1 nhviên ko thể thgia >= 2 d.án trong cùng khoảng thgian. create Trigger Cau8c on Phan_cong for Insert, Update As
declare @count int declare @ngay datetime declare @ngaykt datetime select @count =count(manv) from Inserted a, Du_an i where i.mada = a.mada and ngaybatdau =@ngay and ngayketthuc =@ngaykt if (@count >0) begin if exists (select * from Inserted where mada in (select distinct mada from Phan_cong group by mada having count(mada)>=2 ) ) begin raiserror('khong the mot nhan vien tham gia 2 du cung 1 khoang thoi gian',16,1) rollback tran end end Câu 9: Viết Trigger đbảo những người thgia trong cùng 1 d.án phải ở những phòng khác nhau Câu 10: Viết Trigger đbảo những người thgia trong cùng 1 d.án phải ở cùng phòng nhau. Câu 11: Viết Trigger đ.bảo 1 nhviên ko thể thgia >=2 d.án trong cùng khoảng thời gian, và sau khi hthành d.án này thgia d.án khác phải cách nhau 5 ngày. Câu 12: Viết Trigger đ.bảo nhvien trphòng phải thuộc phòng đó Câu 13: Viết câu truy vấn liệt kê tên nhviên đang thgia nhiều hơn 1 d.án select tennv from Du_an a, Phan_cong b, Nhan_vien c where a.mada = b.mada and b.manv=b.manv group by tennv having count(tennv)>1 Câu 14: Viết câu trvấn liệt kê tên d.án đã h.thành mà số người thgia gia d.án này >= 5 và trong đó ko có trphòng nào. - Đầu tiên viết hàm trả về số trưởng phòng thgia các d.án Create function Cau14(@Ngay datetime) returns @KQ table ( mada char(10), tenda char(100), sotp int ) AS Begin insert into @KQ(tenda,sotp) select a.tenda, a.tenda, ( select count(b.mada) from Du_an b, Phan_cong c, Phong_ban d where b.mada=c.mada and c.manv=d.matp and b.mada=a.mada group by b.mada ) from Du_an a update @KQ set sotp=0 where sotp is null return End - Viết câu trvấn
select tenda from Cau14() a, Du_an b, Phan_cong c where a.mada=b.mada and b.ngayketthuc<=getdate() and a.sotp=0 and b.mada=c.mada group by tenda having count(tenda)>=5 Câu 15: LKê các d.án mà nhân viên thgia d.án này ở trong các phòng khác nhau. - Viết hàm trả về số nhân viên của các d.án Create function Cau15a() returns @KQ table ( mada char(10), sonv int ) AS Begin insert into @KQ(mada,sonv) select a.mada,( select count(b.mada) from Du_an b, Phan_cong c where b.mada=c.mada and b.mada=a.mada group by b.mada ) from Du_an a update @KQ set sonv=0 where sonv is null return End - Viết hàm trả về số các phòng ban khác nhau của các d.án create function Cau15b() returns @KQ table ( mada char(10), sopb int ) AS Begin insert into @KQ(mada,sopb) select a.mada,( select count(e.mapb) from Du_an b, Phan_cong c, Nhan_vien d, Phong_ban e where b.mada=c.mada and c.manv = d.manv and d.mapb = e.mapb and b.mada=a.mada group by e.mapb ) from Du_an a update @KQ set sopb=0 where sopb is null return End - Viết câu truy vấn Select a.mada from Cau15a() a, Cau15b() b where a.mada=b.mada and a.sonv=b.sopb Câu 16: LKê các khhàng chỉ có 1 d.án và dự án này đã hoàn thành và số nhvien thgia >= 5 select makh from Du_an a where a.ngayketthuc <= getdate() and makh not in ( select makh from Du_an where ngayketthuc > getdate()
) and (select count(manv) from Du_an b, Phan_cong c where b.mada=c.mada and b.mada=a.mada)>=5 group by makh having count(makh)=1 Câu 17: Lkê ít nhất là khách hàng có số d.án hoàn thành trong tháng này. select makh from Du_an where month(ngayketthuc)=month(getdate()) and year(ngayketthuc)=year(getdate()) group by makh having count(makh)>=3 Câu 18: Hãy lkê: tên nhviên, số d.án thgia, tổng số ngày hoàn thành. select a.tennv, count(distinct b.mada),(cast(day(c.ngaybatdau)as int)-cast(day(c.ngayketthuc)as int ) +1)from Nhan_vien a inner join Phan_cong b on a.manv =b.manv inner join Du_an c on b.mada = c.mada group by a.tennv,b.mada,c.ngaybatdau,c.ngayketthuc
THỰC PHẨM NHÀ BẾP Câu 1: Viết Trigger đbảo chỉ xuất các lô hàng có số lượng còn lại trong kho. Create Trigger Cau1 on Chi_tiet_xuat for insert, update as if exists (select * from Inserted where malo in (select matp from Lo_hang l inner join Chi_tiet_xuat c on l.malo = c.malo where c.soluong_xuat > l.soluong_nhap) ) begin raiserror ('ton kho am',16,1) rollback tran end Câu 2: Viết Trigger đbảo chỉ cho xuất các lô hàng còn hạn sử dụng. Create Trigger Cau on Chi_tiet_xuat for insert, update as if exists (select * from Inserted where malo in (select matp from Lo_hang where (getdate() - ngaynhap) > songay_sudung) ) begin raiserror ('thuc pham qua han',16,1) rollback tran end Câu 3: Viết Trigger đbảo trong một ngày , một loại sản phẩm số lượng xuất ko quá 10. Create Trigger Cau3 on Xuat_nau for insert, update as declare @ngay datetime declare @count int select @count = count(distinct maxuat) from Inserted where ngayxuat =@ngay if (@count >0) begin if exists (select * from Inserted where maxuat in (select distinct l.matp from Lo_hang l inner join Chi_tiet_xuat c on l.malo = c.malo where c.soluong_xuat >10 group by matp having count(distinct matp) =1) ) begin raiserror ('so luong xuat phai la 10 tp',16,1) rollback tran end
end Câu 4: Viết Trigger đbảo ứng với mỗi lô sản phẩm ko đc xuất quá 2 lần. Create trigger cau4 on Lo_hang for insert, update as if exists (select * from Inserted i where i.malo in (select ct.malo from Chi_tiet_xuat ct, Lo_hang h where h.malo =ct.malo group by ct.malo having count(ct.malo) >2) ) begin raiserror ('khong xuat qua 2 lan',16,1) rollback tran end Câu 5: Viết Trigger đbảo tổng số lượng trên phiếu xuất ko quá 10. Create trigger cau5 on Chi_tiet_xuat for insert, update as declare @soluong int select @soluong=sum(soluong_xuat) from Chi_tiet_xuat group by maxuat if exists ( select * from Inserted i inner join Chi_tiet_xuat ct on i.maxuat=ct.maxuat where (@soluong+i.soluong_xuat) >10 ) begin raiserror ('so luong xuat khong duoc qua 10',16,1) rollback tran end Câu 6: Viết Trigger đbảo ngày xuất phải lớn hơn hoặc bằng ngày nhập. Create trigger cau6 on Xuat_nau for insert, update as declare @ngaynhap datetime select @ngaynhap=ngaynhap from Lo_hang if exists ( select * from Inserted i,Chi_tiet_xuat ct,Lo_hang l where i.maxuat=ct.maxuat and l.malo=ct.malo and ngayxuat<@ngaynhap ) begin
raiserror ('ngay xuat phai lon hon hoac bang ngay nhap',16,1) rollback tran end Câu 7: Liệt kê tên thực phẩm đã hết hạn sử dụng và số lượng còn lại trong kho > 0 Select t.matp,t.tenthucpham ,soluong_conlai=(sum(soluong_nhap)- sum(soluong_xuat)) from Thuc_pham t,Lo_hang l,Chi_tiet_xuat ct where t.matp=l.matp and l.malo=ct.malo and (getdate()- ngaynhap)>songay_sudung group by t.matp,t.tenthucpham Câu 8: Liệt kê tên các sản phẩm số lượng còn lại trong kho >= 10 và nhập cách đây 2 ngày và thực phẩm đó chưa hết hạn sử dụng. Select t.matp,t.tenthucpham ,soluong_conlai=(sum(soluong_nhap)-sum(soluong_xuat)) from Thuc_pham t,Lo_hang l,Chi_tiet_xuat ct where t.matp=l.matp and l.malo=ct.malo and (getdate()- ngaynhap)< songay_sudung and (getdate()- ngaynhap)=2 group by t.matp,t.tenthucpham having (sum(soluong_nhap)-sum(soluong_xuat))>=10 Câu 9: Cho biết tên sản phẩm xuất ở lô có số lượng nhiều nhất được nhập trong ngày. Select t.matp,t.tenthucpham, max(soluong_xuat) from Thuc_pham t,Lo_hang l,Chi_tiet_xuat ct where t.matp=l.matp and l.malo=ct.malo and ngaynhap = getdate () group by t.matp,t.tenthucpham Câu 10: Cho biết tên thực phẩm ở những lô đã hết hạn sdụng nhưng chưa xuất lần nào. Select t.matp, tenthucpham from Thuc_pham t, Lo_hang h ,Chi_tiet_xuat ct where t.matp = h.matp and ct.malo= h.malo and getdate() - ngaynhap >songay_sudung and h.malo not in (select malo from Chi_tiet_xuat ) Câu 11: Hãy lkê: tên thphẩm, tên loại, slượng nhập, slượng xuất, slượng còn lại. (trong tháng hiện tại). Create function dbo.Tonkhohientai(@ngay int, @thang int, @nam int) returns @TonKho table ( tentp char (50), malh char (5), sln int, slx int, slt int ) as begin insert into @TonKho(tentp,malh,sln,slx) select a.tenthucpham,b.maloai, (select sum(c.soluong_nhap) from Lo_hang c where day(c.ngaynhap) < @ngay and month(c.ngaynhap)= @thang and year(c.ngaynhap)=@nam), (select sum(d.soluong_xuat) from Chi_tiet_xuat d, Xuat_nau e where d.maxuat = e.maxuat and day(e.ngayxuat)<@ngay and month(e.ngayxuat)= @thang and year(e.ngayxuat)=@nam) from Thuc_pham a inner join Loai_thuc_pham b on a.maloai = b.maloai
update @TonKho set slt = sln - slx return end Câu 12: Hãy lkê các thphẩm đã hhạn sdụng: tên thphẩm, slượng nhập, slxuất, slượng còn lại Select t.matp, tenthucpham, soluong_nhap,soluong_xuat, SLT = soluong_nhap - soluong_xuat from Thuc_pham t, Lo_hang h ,Chi_tiet_xuat ct where t.matp = h.matp and ct.malo= h.malo and getdate() - ngaynhap >songay_sudung
QUANLYTOUR Câu 1: Viết Trigger đảm bảo một xe không thể xếp cho 2 lịch trình trùng thời điểm drop view Xe_Lichtrinh create view Xe_Lichtrinh as select distinct p.maxe,l.ngaydi,l.ngayve from Xe as x, Lich_trinh as l,Phan_cong as p where x.maxe=p.maxe and l.malich=p.malich go drop trigger Xe_phancong go create trigger Xe_phancong on Phan_cong for insert as begin if exists( Select distinct t2.maxe from Xe as x,Lich_trinh as l,inserted as t2 where x.maxe=t2.maxe and l.malich=t2.malich and l.ngaydi in(select x1.ngaydi from Xe_Lichtrinh as x1,inserted as t2 where x1.maxe=t2.maxe) and l.ngayve in(select x1.ngayve from Xe_Lichtrinh as x1,inserted as t2 where x1.maxe=t2.maxe) ) begin Print 'Không thể chèn được' rollback tran end end go insert into Phan_cong(malich,maxe,matx) values (2,3,1) go Câu 2: Viết Trigger đảm bảo một tài xế không thể xếp cho 2 lịch trình trùng thời điểm drop view TaiXe_Lichtrinh
create view TaiXe_Lichtrinh as select distinct p.matx,l.ngaydi,l.ngayve from Tai_xe as t, Lich_trinh as l,Phan_cong as p where t.matx=p.matx and l.malich=p.malich go select * from TaiXe_Lichtrinh go drop trigger TaiXe_phancong go create trigger TaiXe_phancong on Phan_cong for insert as begin if exists( Select distinct t2.matx from Tai_xe as t,Lich_trinh as l,inserted as t2 where t.matx=t2.matx and l.malich=t2.malich and l.ngaydi in(select x1.ngaydi from TaiXe_Lichtrinh as x1,inserted as t2 where x1.matx=t2.matx) and l.ngayve in(select x1.ngayve from TaiXe_Lichtrinh as x1,inserted as t2 where x1.matx=t2.matx) ) begin Print 'Không thể chèn được' rollback tran end end go insert into Phan_cong(malich,maxe,matx) values (2,3,1) go Câu 3: Viết Trigger đảm bảo chỉ phân công tài xế cho các lịch trình mà tp xuất phát trùng với tp của tài xế drop trigger TP_Phancong create trigger TP_Phancong on Phan_cong for insert as begin if exists (select t.matx from Tai_xe as t,inserted as t2 where t.matx=t2.matx) begin declare @matp nchar(10) select @matp=(select t.matp from inserted as t2,Tai_xe as t where t.matx=t2.matx) declare @matp_di nchar(10)
select @matp_di=(select l.matp_di from inserted as t2,Lich_trinh as l where l.malich=t2.malich) if(@matp_di <> @matp) begin Print 'Lịch trình không thỏa' Rollback tran end end end insert into Phan_cong(malich,maxe,matx) values (1,2,3) go Câu 4: Viết Trigger đảm bảo với các lịch trình có kc thời gian đi về >=3 ngày phải do các xe có số ghế ngồi >=20 và tài xế đi lịch trình đó phải có tp trùng với tp xuất phát drop trigger LT_Phancong create trigger LT_Phancong on Phan_cong for insert as begin if exists (select t2.* from Lich_trinh as l,Inserted as t2 where l.malich=t2.malich and datediff(d,l.ngaydi,l.ngayve)>=3) begin declare @soghe int select @soghe=(Select soghe from Xe as x,Inserted as t2 where x.maxe=t2.maxe) if(@soghe <20) begin Print'Lịch trình này phải do các xe có số ghế ngồi >=20' Rollback tran end declare @matp nchar(10) select @matp=(select t.matp from inserted as t2,Tai_xe as t where t.matx=t2.matx) declare @matp_di nchar(10) select @matp_di=(select l.matp_di from inserted as t2,Lich_trinh as l where l.malich=t2.malich) if(@matp_di <> @matp) begin Print 'Lịch trình này tài xế phải có tp trùng với tp đi' Rollback tran end end end go insert into Phan_cong(malich,maxe,matx) values (2,2,2) go
Câu 5: Viết Trigger đảm bảo với các lịch trình có kc thời gian đi về <=3 ngày thì ko có quá 3 xe và 3 tài xế cho lịch trình đó drop trigger LT1_Phancong create trigger LT1_Phancong on Phan_cong for insert as begin if exists (select l.malich from Lich_trinh as l,Inserted as t2 where l.malich=t2.malich and datediff(d,l.ngaydi,l.ngayve)<=3) begin declare @somaxe int select @somaxe=(Select count(distinct p.maxe) from Inserted as t2,Phan_cong as p where p.malich=t2.malich) if(@somaxe >3) begin Print'Lịch trình này không quá 3 xe' Rollback tran end declare @sotaixe int select @sotaixe=(select count(distinct p.matx) from inserted as t2,Phan_cong as p where p.malich=t2.malich) if(@sotaixe >3) begin Print 'Lịch trình này số tài xế không quá 3' Rollback tran end end end go insert into Phan_cong(malich,maxe,matx) values (2,1,4) go Câu 6: Liệt kê tên tài xế đi các lịch trình có khoảng cách thời gian >=3 ngày lái các xe có số chỗ >=20,tp của txế đó trùng với tp đến Select t.tentx from ((Tai_xe as t inner join Phan_cong as p on t.matx=p.matx) inner join Lich_trinh as l on p.malich=l.malich) inner join Xe as x on p.maxe=x.maxe where datediff(d,l.ngaydi,l.ngayve)>=3 and x.soghe>=20 and t.matp=l.matp_den Câu 7: Hãy tổng kết :tên txế,số lịch trình đã đi,số xe đã lái Select t.tentx,count(distinct p.malich) as SOLT,count (distinct maxe) as SOXE from Tai_xe as t inner join Phan_cong as p on t.matx=p.matx
group by t.tentx Câu 9: Viết trigger đảm bảo một tài xế được phân công cho 1 lịch trình thì chỉ khi kết thúc lịch trình đó mới được phân công cho lịch trình khác create view PC as select t.matx,p.malich,l.ngaydi,l.ngayve from Tai_xe as t,Phan_cong as p,Lich_trinh as l where t.matx=p.matx and p.malich=l.malich Select * from PC drop trigger PC_TX create trigger PC_TX on Phan_cong for insert as if not exists (Select * from Lich_trinh as l,inserted as i,PC as v where i.malich=l.malich and v.matx=i.matx and datediff(d,v.ngayve,l.ngaydi)>0 ) begin Print'Tai xe nay chua ve' rollback tran end go Câu 10: Liệt kê tên các tài xế chỉ đi các lịch trình có kc thời gian >=3 ngày lịch trình này sử dụng ít nhất 2 xe có số ghế >=20 create view Q1 as Select p.* from Phan_cong as p,Lich_trinh as l where l.malich=p.malich and datediff(d,l.ngaydi,l.ngayve)>=3 go select * from Q1 go create view Q2 as select malich,matx,maxe from Q1 Group by malich,matx,maxe Having maxe in(select maxe from Xe where soghe>=20) go Select * from Q2 create view Q3 as
Select malich,matx,count(distinct maxe)as TSX from Q2 Group by malich,matx Having count(distinct maxe)>=2 select t.tentx from Tai_xe as t,Q3 where Q3.matx=t.matx
QUANLYHOKHAU Câu 1: Viết trigger đảm bảo 1 công dân chỉ có 1 hộ khẩu drop trigger CD_ChiTiêt Create trigger CD_ChiTiêt on Chi_tiet_ho_khau for insert as if exists (Select a.masohk from Ho_khau as a,Cong_dan as c,inserted as b where c.masocmnd=b.masocmnd and a.masohk=b.masohk) begin Print'1 công dân chỉ có 1 hộ khẩu' Rollback tran end go insert into Chi_tiet_ho_khau (masohk,masocmnd,mavaitro) values(3,345678,2) go Câu 2: Viết trigger đảm bảo 1 hộ khẩu chỉ chứa các công dân có cùng địa chỉ với hộ khẩu đó drop trigger HK_ChiTiet create trigger HK_ChiTiet on Chi_tiet_ho_khau for insert as if not exists (Select * from Ho_khau as a,Cong_dan as d,inserted as c where d.madc=a.madc_hk and c.masohk=a.masohk and c.masocmnd=d.masocmnd) begin Print ' Hộ khẩu chỉ chứa công dân có cùng dc' Rollback tran end go insert into Chi_tiet_ho_khau (masohk,masocmnd,mavaitro) values(1,389760,2) go Câu 3: Viết trigger đảm bảo 1 hộ khẩu chỉ cho phép có tối đa 3 dc của các công dân trong hk đó khác nhau drop trigger HK1_Chitiet create trigger HK1_Chitiet on Chi_tiet_ho_khau for insert as if exists(Select c.masohk from Cong_dan as b,inserted as c where b.masocmnd=c.masocmnd group by c.masohk having count(distinct b.madc)>3 ) begin Print N'Hộ khẩu chỉ cho phép tối đa 3 địa chỉ của công dân trong hộ khẩu đó khác nhau'
Rollback tran end go insert into Chi_tiet_ho_khau (masohk,masocmnd,mavaitro) values(1,389760,2) go Câu 4: Viết trigger đảm bảo các vai trò trong hộ khẩu không quá 5 create trigger VT_CT on Chi_tiet_ho_khau for insert as if not exists (Select a.masohk from Ho_khau as a,inserted as b where b.masohk=a.masohk and b.mavaitro in(Select b.mavaitro from Ho_khau as c where c.masohk=b.masohk)) Begin if(Select count(distinct a.mavaitro) from inserted as a,Ho_khau as b where b.masohk=a.masohk) >5 begin Print 'Các vai trò trong hk không quá 5' Rollback tran end end go insert into Chi_tiet_ho_khau (masohk,masocmnd,mavaitro) values('1','389760','3') go Câu 5: Tìm những hộ khẩu mà dc của hộ khẩu trùng với dc của tất cả các thành viên trong hộ khẩu đó Select masohk from Ho_khau where masohk not in (Select b.masohk from Cong_dan as a,Chi_tiet_ho_khau as b,Ho_khau as c where b.masocmnd=a.masocmnd and b.masohk=c.masohk and a.madc <> c.madc_hk) Câu 6: Tìm những hộ khẩu mà dc hk ko trùng với bất kỳ dc nào của các thành viên select masohk from Ho_khau where masohk not in (Select b.masohk from Cong_dan as a,Chi_tiet_ho_khau as b,Ho_khau as c where b.masocmnd=a.masocmnd and b.masohk=c.masohk and a.madc = c.madc_hk) Câu 7:Tìm những hộ khẩu mà tất cả các thành viên trong hk đó có tuổi >18 select masohk
from Ho_khau where masohk not in (Select b.masohk from Cong_dan as c,Chi_tiet_ho_khau as b,Ho_khau as a where c.masocmnd=b.masocmnd and b.masohk=a.masohk and datediff(d,ngaysinh,getdate())<=18) Câu 8: Liệt kê các họ tên trong các hộ khẩu có số thành viên>=5 Select a.hoten,b.masohk from Cong_dan as a,Ho_khau as b,Chi_tiet_ho_khau as c where b.masohk=c.masohk and a.masocmnd=c.masocmnd group by a.hoten,b.masohk having count(c.masohk)>=5 Câu 9: Liệt kê hộ khẩu có số vai trò trùng nhau >=3 Select a.masohk,b.mavaitro from Ho_khau as a,Chi_tiet_ho_khau as b,Cong_dan as c where a.masohk=b.masohk and b.masocmnd=c.masocmnd group by a.masohk,b.mavaitro having count(mavaitro)>=3 Câu 11: Hãy tổng kết:masohk,số thành viên,số dc khác nhau trong hk,số vai trò khác nhau select a.masohk,count(distinct c.masocmnd)as STV,count(distinct c.madc) as SDC,count(distinct b.mavaitro)as SVT from Ho_khau as a,Chi_tiet_ho_khau as b,Cong_dan as c where a.masohk=b.masohk and c.masocmnd=b.masocmnd group by a.masohk