• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Nhờ giúp câu truy vấn SQL khó này với các bạn.

Chuyên mục thảo luận các vấn đề liên quan đến ứng dụng quản lý và cơ sở dữ liệu

Điều hành viên: Điều hành

muaphonui_2010
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 471
Ngày tham gia: T.Sáu 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 173 time
Been thanked: 27 time
Liên hệ:

Nhờ giúp câu truy vấn SQL khó này với các bạn.

Gửi bàigửi bởi muaphonui_2010 » CN 13/03/2016 10:13 pm

Chào các bạn!
Giả sử mình có 2 table như sau:
Table 1
taikhoan----------------- tentaikhoan
111----------------- Tiên mặt
1111----------------- Tiền mặt Việt Nam
1112 ------------------- Tiền mặt ngoại tệ
112------------------- Tiền gửi ngân hàng
1121----------------- Tiền gửi ngân hàng ACB
11211----------------- Tiền gửi ngân hàng ACB: VND
11212----------------- Tiền gửi ngân hàng VCB : Ngoại tệ
112121----------------- Tiền gửi ngân hàng VCB : USD
112122 ----------------- Tiền gửi ngân hàng VCB : EUR
131--------------------- Phải thu của khách hàng
1311--------------------- Phải thu của khách hàng Ngắn hạn
13111 ----------------- Phải thu của khách hàng Ngắn hạn : VND
13112 ----------------- Phải thu của khách hàng Ngắn hạn : Ngọai tệ
131121 ----------------- Phải thu của khách hàng Ngắn hạn : USD
131122 ----------------- Phải thu của khách hàng Ngắn hạn : EUR


Table2 (số liệu)

taikhoan----------------- sotien
1111----------------- 10.000.000
13111----------------- 50.000.000
131121----------------- 20.000.000
131122----------------- 15.000.000



==> Nhờ các bạn giúp mình câu SQL sao cho ra kết qua như bản dưới với.

taikhoan----------------- sotien ----------------- Ghi chú
111----------------- 10.000.000----------------- = 1111
1111 ----------------- 10.000.000
131----------------- 85.000.000
1311----------------- 85.000.000----------------- = 13111 + 13112
13111----------------- 50.000.000
13112----------------- 35.000.000----------------- = 131121 + 131122
131121----------------- 20.000.000
131122----------------- 15.000.000


==> Theo như kế toán là phát sinh thì theo tài khoản con, nhưng khi lên báo cáo thì thể hiện cho tải khoản mẹ luôn.
Cái này khó quá mình ko biết lần từ đâu nên nhờ các bạn giúp mình với.
Xin chân thành cảm ơn!



Hình đại diện của người dùng
vietteiv
Quản trị
Quản trị
Bài viết: 1318
Ngày tham gia: T.Bảy 10/02/2007 12:17 am
Đến từ: Cung cấp giải pháp quản lý doanh nghiệp, dự án, tư vấn xây dựng
Has thanked: 6 time
Been thanked: 69 time
Liên hệ:

Re: Nhờ giúp câu truy vấn SQL khó này với các bạn.

Gửi bàigửi bởi vietteiv » T.Ba 15/03/2016 10:05 am

trong bảng table1 nên thêm 1 cột TKCha sẽ tổng hợp dữ liệu nhanh hơn
taikhoanid,tentaikhoan,tkcha
111 --- Tiên mặt ---- "" (rỗng hoặc Null)
1111 --- Tiền mặt Việt Nam --- 111
1112 --- Tiền mặt ngoại tệ --- 111

muaphonui_2010
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 471
Ngày tham gia: T.Sáu 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 173 time
Been thanked: 27 time
Liên hệ:

Re: Nhờ giúp câu truy vấn SQL khó này với các bạn.

Gửi bàigửi bởi muaphonui_2010 » T.Ba 15/03/2016 11:09 am

Cảm ơn anh!
Nếu trường hợp thêm 1 cột tài khoản "CHA" vào Danh Mục tài khoản thì câu truy vấn viết sao để lấy được số liệu như trên vậy anh, anh giúp em với nha anh.
Vì trong thực tế em cũng có xem mấy phần mềm kế toán, người ta cũng có cột "Tài khoản cha" như anh nói.
Mong được anh giúp đỡ.
Xin cảm ơn!

cuibaphp
Thành viên chính thức
Thành viên chính thức
Bài viết: 30
Ngày tham gia: T.Ba 04/09/2012 3:04 pm
Been thanked: 15 time

Re: Nhờ giúp câu truy vấn SQL khó này với các bạn.

Gửi bàigửi bởi cuibaphp » T.Tư 16/03/2016 9:07 am

Chào bạn, mình cũng đã từng làm phần mềm kế toán nên chia sẻ với bạn về vấn đề này có 2 hướng giải quyết khi đưa lên bảng báo cáo, chắc là bảng cân đối tài khoản hoặc báo cáo tài chính.

C1. Bạn có thể tính toán trong SQL các tài khoản phát sinh dữ liệu VD 1111, 1112, khi lên báo cáo cái 111 nó = 0, sau đó bạn dùng trong code vb.net của bạn đệ quy lại các cấp trên cộng dồn lại các giá trị rồi điền lại cho tài khoản cha.

C2. Nếu bạn muốn Query luôn trong CSDL bắt buộc phải đệ quy tài khoản, mình VD trường hợp của mình như sau:

Bảng tài khoản của mình
bang tai khoan.jpg
bang tai khoan.jpg (63.54 KiB) Đã xem 871 lần


Bảng chứng từ phát sinh
tblChungTuCT.png
tblChungTuCT.png (13.97 KiB) Đã xem 871 lần

ở đây mình quan tâm đến dữ liệu trường TaiKhoanNo và ThanhTien thôi nhé.

Ý tưởng query là thế này

Mã: Chọn hết

SELECT SoTaiKhoan, TenTaiKhoan,
(SELECT SUM(ThanhTien) FROM tblChungTuCT WHERE TaiKhoanNo IN (@DsTaiKhoan) ThanhTien
FROM tblTaiKhoan

Khi nó duyệt qua bảng tblTaiKhoan sẽ SUM ThanhTien bên chứng từ , VD khi nó duyệt đến tài khoản 111 (không phát sinh trong bảng tblChungTuCT nhưng có 1111 và 1112 là con của 111 phát sinh) vì vậy @DsTaiKhoan trong query kia khi duyệt đến 111 nó sẽ có giá trị là '111','1111','1112','1113'. Để làm được việc đó mình sử dụng 1 function đệ quy với tham số đầu vào là số tài khoản sẽ trả về list tài khoản con của nó:

Mã: Chọn hết

CREATE FUNCTION fcn_DeQuy_SoTaiKhoan
(
   @SoTaiKhoan NVARCHAR(30)
)   
RETURNS TABLE
AS
RETURN

   WITH temp(SoTaiKhoan, TenTaiKhoan, CapDo) 
    as ( 
            Select SoTaiKhoan, TenTaiKhoan, 0 as CapDo 
            From tblTaiKhoan 
            Where SoTaiKhoan = @SoTaiKhoan AND TrangThai = 1
            Union All   
            Select b.SoTaiKhoan, b.TenTaiKhoan, a.CapDo + 1 
            From temp as a, tblTaiKhoan as b 
            Where a.SoTaiKhoan = b.SoTaiKhoanCha AND b.TrangThai = 1
    ) 
    Select *   
    From temp 


Chạy thử với tham số đầu vào là 112:
chay thu queary.jpg
chay thu queary.jpg (24.08 KiB) Đã xem 871 lần


OK, vậy thì vấn đề còn lại là sửa câu Query trên kia thôi

Mã: Chọn hết

SELECT SoTaiKhoan, TenTaiKhoan,
(
   SELECT SUM(ThanhTien) FROM tblChungTuCT WHERE TaiKhoanNo IN
   (SELECT SoTaiKhoan FROM dbo.fcn_DeQuy_SoTaiKhoan(tblTaiKhoan.SoTaiKhoan))
)ThanhTien
FROM tblTaiKhoan


ket qua .jpg


Với kết quả trên bạn thấy
112 = 1121 + 1122 + 1123
1121 = 11212 + 11213 + 11215

:)

muaphonui_2010
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 471
Ngày tham gia: T.Sáu 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 173 time
Been thanked: 27 time
Liên hệ:

Re: Nhờ giúp câu truy vấn SQL khó này với các bạn.

Gửi bàigửi bởi muaphonui_2010 » T.Tư 16/03/2016 2:30 pm

Cảm ơn bạn nhiều nhé, code của bạn thật hay.
Hiện tại mình đang dự định làm như vầy, nhưng chưa nghĩ ra được nếu dùng code như dưới thì có bị vấn đề gì không.
Chứ mình thấy nó cũng lấy số liệu lên ok.

Mã: Chọn hết

SELECT     taikhoan, tentaikhoan,
                          (SELECT     SUM(sotien1) AS sotien1
                            FROM          dbo.phasinh
                            WHERE      (taikhoan LIKE dbo.taikhoan.taikhoan + '%')) AS sotien1,
                          (SELECT     SUM(sotien2) AS sotien2
                            FROM          dbo.phasinh AS phasinh_1
                            WHERE      (taikhoan LIKE dbo.taikhoan.taikhoan + '%')) AS sotien2
FROM         dbo.taikhoan

Hình minh họa
Hình ảnh

Xin cảm ơn bạn lần nữa.

cuibaphp
Thành viên chính thức
Thành viên chính thức
Bài viết: 30
Ngày tham gia: T.Ba 04/09/2012 3:04 pm
Been thanked: 15 time

Re: Nhờ giúp câu truy vấn SQL khó này với các bạn.

Gửi bàigửi bởi cuibaphp » T.Tư 16/03/2016 3:08 pm

Với đặc điểm của hệ thống tài khoản kế toán và yêu cầu lấy dữ liệu như của bạn thì không vấn đề gì đâu.

Hình đại diện của người dùng
vietteiv
Quản trị
Quản trị
Bài viết: 1318
Ngày tham gia: T.Bảy 10/02/2007 12:17 am
Đến từ: Cung cấp giải pháp quản lý doanh nghiệp, dự án, tư vấn xây dựng
Has thanked: 6 time
Been thanked: 69 time
Liên hệ:

Re: Nhờ giúp câu truy vấn SQL khó này với các bạn.

Gửi bàigửi bởi vietteiv » T.Năm 17/03/2016 11:18 am

về mặt sử dụng dữ liệu, dễ làm các báo cáo phân tích mở rộng sau này theo nhu cầu của khách hàng thì em nên thêm cột tkcha và có thể làm theo cách của cuibaphp.

nếu là kinh doanh phần mềm thì dữ liệu mỗi khách hàng mỗi kiểu. nếu có cột tkcha thì nó cũng giải quyết luôn trường hợp khách hàng thích đặt tài khoản có dấu ký tự đặt biệt trong đó.
ví dụ:
1311
1311.HD
1311.1HD - công nợ bán hàng - khu vực HD
1311.2HD - công nợ quá hạn - khu vực HD
1311.SG
1311.1SG - công nợ bán hàng - khu vực SG
1311.2SG - công nợ quá hạn - khu vực SG
...
yêu cầu thống kê dữ liệu công nợ khách hàng chỉ liệt kê tài khoản cha (nhiều cấp cha). nếu ko có cột tkcha thì em phải xử lý cắt chuỗi để phân biệt tk cha con.

cấu trúc table tài khoản em có thể làm như hình. anh có sẵn luôn 1 cột ISTAIKHOANCHA để lọc dữ liệu cho dễ
Tập tin đính kèm
2016-03-17_11-16-13.png


Quay về “Ứng dụng Quản lý và Cơ sở dữ liệu”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.2 khách