Cách tạo quan hệ trong nhóm dữ liệu

Liên hệ QC

namdan123

Thành viên mới
Tham gia
25/3/11
Bài viết
6
Được thích
0
Em chào các Anh !
Các Anh/Chị cho em hỏi em có một trường dữ liệu gồm các cột trong sheets data bây giờ em muốn tạo mối quan hệ giữa chúng:
VD: Trong data có các quan hệ BG01, BG02, BG03, BG04, BG05, BG06 thì kết quả sẽ ra ( không tạo quan hệ với chính nó)
BG01-BG02
BG01-BG03
BG01-BG05
Tương tự
BG02-BG01
BG02-BG03
BG01-BG04 (không tạo do trong cột ACT là Not chỉ tạo những quan hệ mà trọng ACT là OK)
Cụ thể trong file đính kèm
Em cảm ơn.
 

File đính kèm

Bạn nên giải thích kỹ hơn. Tôi đọc và nghiên cứu file của bạn vẫn không hiểu được yêu cầu.
Liệu diễn giải thế này có đúng không nhé:
Cho tập đầu vào 1,2....n
Và tập kết quả là tổ hợp 2 phần tử của các phần tử thuộc tập đầu vào đó
Tìm những tổ hợp chứa những phần tử không tồn tại trong tập đầu vào?
Nếu đúng thế thì bài toán là một dạng khác!
 
Anh hiếu đúng ý em rồi Ah, em nói ví dụ cụ thể:
trong sheet Data2: có tập BG391, BG392, BG393 vậy trong Sheet data1 phải có các cặp là
BG391-BG392
BG391-BG393
BG392-BG391
BG392-BG393
BG393-BG391
BG393-BG392
==> Giả sử trong sheet data1 thiếu cặp quan hệ BG391-BG392 làm thế nào để đây ra sheet kết quả thiếu BG391-BG392.
(Nếu thêm điều kiện trong sheet data2 trong cột ACT Not thì không đẩy ra kết quả ra cặp thiếu nữa thì tốt ah)

Em xin lưu ý là trong sheet data2 gồm nhiều tập con VD
Tập con 1: BG391, BG392, BG393 ==> Có chung mã là BG39.
Tập con 2: BG01, BG02, BG03, BG04, BG05, BG06 ==> Có chung mã là BG0.
các tập này không được kết hợp với nhau.


Em xin bổ sung trong sheet data2 gồm nhiều tập con VD
Tập con 1: BG391, BG392, BG393 ==> Có chung mã là BG39.
Tập con 2: BG01, BG02, BG03, BG04, BG05, BG06 ==> Có chung mã là BG0.
các tập này không được kết hợp với nhau.
VD tập
BG391, BG392, BG393 ==> Tạo ra kết quả
BG391-BG392
BG391-BG393
BG392-BG391
BG392-BG393
BG393-BG391
BG393-BG392
 
Chỉnh sửa lần cuối bởi điều hành viên:
Vẫn khó hiểu vì tớ chưa thể hiểu được cái kết quả của cậu.
Hãy nhìn file ví dụ tớ gửi này!

Ối giời - cậu không chịu sử dụng tính năng sửa bài, tiết kiệm nguồn lực một tí! tớ tưởng là tập con tổng thể! Nếu thế thì vấn đề lại khác. Cậu phải chỉ ra được cách xây dựng tập con và phải có cách phân loại tập con cho phù hợp theo nguyên tắc nào đó thì mới mần được chớ!
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Em chào các Anh !
Các Anh/Chị cho em hỏi em có một trường dữ liệu gồm các cột trong sheets data bây giờ em muốn tạo mối quan hệ giữa chúng:
VD: Trong data có các quan hệ BG01, BG02, BG03, BG04, BG05, BG06 thì kết quả sẽ ra ( không tạo quan hệ với chính nó)
BG01-BG02
BG01-BG03
BG01-BG05
Tương tự
BG02-BG01
BG02-BG03
BG01-BG04 (không tạo do trong cột ACT là Not chỉ tạo những quan hệ mà trọng ACT là OK)
Cụ thể trong file đính kèm
Em cảm ơn.

giải bài một của bạn trước,
phải mượn cột phụ

Rùi thử luôn yêu cầu thứ 2
 

File đính kèm

Lần chỉnh sửa cuối:
Em cảm ơn !
Anh có thể chỉ tạo ra các quan hệ trong cùng một tập như đề cập bổ sung của em được không ah.
 
Em cảm ơn !
Anh có thể chỉ tạo ra các quan hệ trong cùng một tập như đề cập bổ sung của em được không ah.

đã bổ sung bên trên, mình chưa có cách nào hay hơn, nên phải mược cột phụ, nếu số liệu của bạn lớn, ko biết nó chạy được ko--=0
 
Sorry, do em mới nhập môn nên còn lơ ngơ ah. Ý của em xây dựng như sau:
- Lấy sheet data2 làm chuẩn, tạo ra các quan hệ trong tập con
VD: Tập con BG391,BG392, BG393 ==> Tạo ra quan hệ chuẩn là
BG391-BG392
BG391-BG393
BG392-BG391
BG392-BG393
BG393-BG391
BG393-BG392
- Từ dữ liệu chuẩn sẽ tiến hành so sánh với sheet data1==> Dùng làm Vlookup nếu có không đẩy ra kết quả, nếu không có đảy ra kết quả là cặp không có.
Hiện tại em chưa nghĩ ra được hàm nào, Anh có thể giúp em xây dựng theo kiểu này được không ah

Em cảm ơn, số liệu của gần 800K dòng, không biết có chạy được không.
Cho em hỏi khi tạo nó lại tạo ra các cặp thừa và cặp chính nó (VD BG01-BG01) vậy có thể xóa or ẩn các cặp này không ah.
VD: BG01-BG02, cặp thừa là BG01-BG012 và chính nó là BG01-BG01, BG01-BG011.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Tôi thấy bạn có nói là có dữ liệu vài trăm ngàn dòng....
Yêu cầu là so dữ liệu với số tổ hợp chuẩn và lọc ra những tổ hợp chuẩn không có số liệu.
Rất tiếc với Cơ sở dữ liệu lớn như vậy thì Excel không nên là một công cụ xử lý dữ liệu bạn ạ.
Mình làm một file ví dụ access để bạn tham khảo.
Dữ liệu nhập vào bảng tblData;
Bảng tổ hợp cho vào tblSeed với Group là nhóm tổ hợp, code là các mã thuộc nhóm.
Qry_..All sẽ giúp bạn tạo danh mục tổ hợp chuẩn;
Qry_unmached sẽ hiển thị các bản ghi không có trong tbldata.
Nên làm bằng công cụ khác!
 

File đính kèm

Tôi luôn luôn theo quan niệm chỉ dùng VBA khi bất đắc dĩ.
Nhưng theo tình trạng bài này thì chính là "bất đắc dĩ" - dùng VBA dễ kiểm soát hơn.
 
Tác giả bài viết có nói rằng cơ sở dữ liệu để so khoảng 800.000 dòng trong một bài viết khác. Là người góp ý để tác giả chọn được một giải pháp phù hợp cho bài toán quản trị thì mình nên đưa ra những đề xuất khác nhau để họ có thể sử dụng. Miễn sao công việc của họ gặp những thuận lợi.
Mình không định nhấn mạnh việc dùng VBA hay trao đổi về giải pháp kỹ thuật (để giải quyết đề bài) mà chủ tâm muốn giới thiệu một cách tiếp cận thô sơ nhưng trả lời được bài toán về 2 phương diện: Kỹ thuật và Hiệu quả quản trị.
Về kỹ thuật thì VBA sẽ phức tạp hơn nếu so với công cụ SQL trong những bài toán không đòi hỏi những phép xử lý phức tạp (ở đây chỉ là thiết lập các nhóm tổ hợp và so sánh).
Về hiệu quả quản trị: Nếu CSDL lớn, việc đưa vào Excel với năng lực quản trị hạn chế sẽ làm giảm hiệu suất công việc. Chính vì lý do đó, mặc dù lúc đầu đã định đưa ra giải pháp về VBA cho tác giả nhưng đọc một bài khác của cậu ấy thì thấy rằng bạn ấy mới bắt đầu bước vào lĩnh vực quản trị dữ liệu nên chưa có nhiều kỹ năng về các loại nền tảng quản trị. Do đó mình quyết định đề nghị dùng Access thôi.
Còn việc lựa chọn giải pháp nào, tác giả sẽ là người cân nhắc hoặc chí ít, các bài trả lời của các thành viên khác về cách dùng công thức hoặc VBA kết hợp đã quá đủ và bài của mình về Access chỉ là một nhành lá nhỏ chèn vào rừng cây giải pháp thôi.
Hihi - xin mạn phép thế!
 
Anh có thể hướng dẫn em dùng VBA được không ah
Để thực hiện bằng VBA thì cách triển khai như thế này:
1. Tạo ra danh sách các dữ liệu tổ hợp đầu vào trong đó giải quyết được 2 việc: Mã đối tượng đầu vào (cột 1), Nhóm tổ hợp của đối tượng đó (cột 2); Cái này gọi là Data2.
Cách thức tổ chức số liệu là các phần tử được sắp xếp theo cột nhóm.
2. Danh sách kết hợp dữ liệu Data1 (dữ liệu này có thể từ đâu đó đưa vào) với 1 cột chưa mã kết hợp (bg...)
3. Tạo danh mục tổ hợp từ Data2 theo nguyên tắc:
+ Chỉ được tổ hợp trong nhóm;
+ Không tổ hợp trung (tổ hợp của một phần tử với chính nó)
Tôi làm giúp bạn 1 thủ tục tạo danh sách chuẩn trong data2.
4. So sánh với dữ liệu trong data 1 và trích lọc
[Bạn có thể tự nghiên cứu vì trong diễn đàn có nhiều người nói về cái này]
Với Acess - bạn chỉ cần 2 câu truy vấn, không cần biết code VBA, chỉ cần biết một chút về cấu trúc SQL và thiết kế cơ sở dữ liệu. Sách có rất nhiều.
Trong bài trước tôi chỉ cần dùng 2 truy vấn này
Truy vấn 1: Tạo danh mục kết hợp mã
[GPECODE=vb]
SELECT a.Group, (a.Code1 & "-" & b.code1) AS code
FROM tblSeed AS a INNER JOIN tblSeed AS b ON a.Group = b.Group
WHERE (((a.Code1)<>.[code1]));
[/GPECODE]
Truy vấn 2: Tạo danh mục mã không tồn tại trong thực tế
[GPECODE=vb]
SELECT qry_combine_all.Group, qry_combine_all.code
FROM qry_combine_all LEFT JOIN tblData ON qry_combine_all.code = tblData.Code
WHERE (((tblData.Code) Is Null));

[/GPECODE]
Với điều kiện có 2 bảng đầu vào như trong bài viết đầu của tôi.

Nhưng với VBA - thì phải tư duy rất nhiều vì phải tưởng tượng ra thuật toán.
Ví dụ đoạn code sau đây - hơi củ chuối nhưng đó là một ví dụ để bạn tưởng tượng.
[GPECODE=vb]Sub CreateCombination() ' Thu tuc tao ra danh sach chuan
Dim InputRange As Range, DstRange As Range, i As Long
Dim Val1 As Range, Val2 As Range
Set InputRange = Range("InputRNG")
Set DstRange = Range("Combination")

Set Val1 = InputRange.Cells(1).Offset(0, 1)
Set Val2 = Val1
While Val1 <> ""
Set Val2 = Val2.Offset(1)
If Val2.Offset(0, -1) <> Val1.Offset(0, -1) Then
Set Val1 = Val1.Offset(1)
Set Val2 = Val1
Else
DstRange.Offset(i + 1) = Val1 & "-" & Val2
DstRange.Offset(i + 2) = Val2 & "-" & Val1
i = i + 2
End If
Wend
End Sub[/GPECODE]
 

File đính kèm

Lần chỉnh sửa cuối:
Cho em hỏi khi tạo nó lại tạo ra các cặp thừa và cặp chính nó (VD BG01-BG01) vậy có thể xóa or ẩn các cặp này không ah.
VD: BG01-BG02, cặp thừa là BG01-BG012 và chính nó là BG01-BG01, BG01-BG011.

Gởi bạn tham khảo thêm một cách làm bằng công thức.
số liệu của bạn lớn quá thì chắc phải sử dụng code thôi.
mà mình ko biết có hiểu đúng ý bạn ko, chứ nếu nguôn của bạn mà 8000 dòng thì nối nhau kiểu đó nó ra bao nhiều dòng?

sorry bạn, sau khi kiểm tra lại vẫn thấy còn giá trị ở cuối dòng bị trùng, mình potay rùi...hì...hì--=0
 

File đính kèm

Lần chỉnh sửa cuối:
Web KT

Bài viết mới nhất

Back
Top Bottom