2012-02-09 36 views
8

Possible Duplicate:
Combine rows in Access 2007
Access 2007 - Concatenate fields from one column in one table into a single, comma delmited value in another tableKết nối nhiều hàng thành dòng trong MS Access

Hiện nay tôi có một cấu trúc bảng là hơi như thế này:

Tên --- Cát --- quyết - - đập lúa --- Perc --- Err --- BP
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- ADC2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 2 ----- BAC2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- RBE2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 8 ----- VBE2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 6 ----- AEC2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- PBC2
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 1 ----- XBC4
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- AEC2
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- PBC2
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 3 ----- ADC2
Bob - ----- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- ADC2
Bob ---- --- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- BAC2
Joe ------ --C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- PBC2
Joe ---- ---- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- ZTM2
Joe-- ------ C1 ------- Inf --------- 7Per -------- 0.05 ------ 2 ----- QYC2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- FLC2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 1 ----- KSC2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 --- --JYC2

Điều tôi muốn làm là có 1 dòng cho mỗi "Tên" và mỗi "Mèo", sẽ tổng hợp tất cả "Err" (theo "Tên" và "Mèo") và chỉ nối các trường "BP" vào một dòng. Chẳng hạn như:

Tên --- Cát --- quyết --- đập lúa --- Perc --- Err --- BP
Bob - ------ C1 ------- Inf -------- 7Per -------- 0.05 ----- 16 ----- BAC2, VBE2, AEC2
Bob ------- C2 ------ Com ------ 8Per -------- 0.45 ------ 4 ------ XBC4, ADC2
Joe -------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 3 ------ QYC2, KSC2

Đã có những câu hỏi tương tự được hỏi nhưng tôi dường như không thể áp dụng nó vì kiến ​​thức về VBA của tôi là người mới bắt đầu. Có cách nào để làm tất cả điều này thông qua SQL? Nếu VBA scripting là lựa chọn duy nhất (tức là tạo một hàm), bất kỳ sự trợ giúp nào cũng sẽ được đánh giá cao. Cảm ơn bạn trước.

Câu hỏi phần 2:
Tôi đã tạo chức năng theo hướng dẫn của Allen Browne. Mô đun được lưu dưới dạng modConcatRelated. Bây giờ, tôi đã cố gắng để chạy truy vấn này (im không chắc chắn nếu điều này là SQL đúng để có được kết quả mà tôi đang tìm):.

SELECT 
    [Name], 
    [Cat], 
    [Desc], 
    [Thresh], 
    [Perc], 
    sum([Err]), 
    ConcatRelated("[BP]", "make_table_bp", "[Err] = " & [BP]) 
FROM make_table_bp 
GROUP BY 
    [Name], 
    [Cat], 
    [Desc], 
    [Thresh], 
    [Perc], 
    [Err], 
    [BP]; 

Nó nói: "Lỗi 3061. Quá ít thông số dự kiến 1. " Ngoài ra nó nói "Undefined Function ConcatRelated". Tôi đang tìm hướng dẫn về cách tạo câu lệnh SQL đúng để tôi có thể gọi hàm ConcatRelated một cách chính xác và mang lại kết quả như được mô tả ở trên. Cảm ơn một lần nữa.

Câu hỏi tiếp theo:
gì nếu bảng đã có một trường ngày độc đáo được gắn thẻ trên như cột cuối cùng trong bảng. Một cái gì đó như thế này:

Tên --- Cát --- quyết --- đập lúa --- Perc --- Err --- BP --- Ngày

Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0- ---- ADC2--12/02/2011
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05- ---- -2 ----- BAC2--09/05/2011
Bob ------- C1 ------- Inf -------- 7Per ------- -0.05 ------ 0 ----- RBE2--11/02/2011
Bob ------- C1 ------- Inf -------- 7Per -------- 0,05 ------ 8 ----- VBE2--08/14/2012
Bob ------- C1 ------- Inf-- ------ 7Per -------- 0.05 ------ 6 ----- AEC2--02/25/2009
Bob ------- C1 --- ---- Inf -------- 7Per -------- 0.05 ------ 0 ----- PBC2--07/02/2011
Bob ---- --- C2 ------- Com ------ 8Per -------- 0.45 ------ 1 ----- XBC4--09/05/2011
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- AEC2--02/02/2010
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- PBC2--08/14/2012
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 3 ----- ADC2-- 05/05/2001
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 --- --ADC2--08/02/2010
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ----- -0 ----- BAC2--06/17/2010
Joe -------- C1 ------- Inf --------- 7Per ----- --- 0,05 ------ 0 ----- PBC2--08/14/2012
Joe -------- C1 ------- Inf ------ --- 7Per -------- 0.05 ------ 0 ----- ZTM2--09/05/2011
Joe -------- C1 ----- --Inf --------- 7Per -------- 0.05 ------ 2 ----- QYC2--05/17/2010
Joe ----- --- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- FLC2--3/19/2010
Joe --- ----- C1 ------- Inf --------- 7Per -------- 0.05 ------ 1 ----- KSC2--09/05/2011
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- JYC2--08/14/2012

Hãy nói rằng tôi muốn xây dựng một truy vấn để nói điều gì đó như: chỉ cho tôi tất cả hồ sơ vẫn trong định dạng này giống nhau:

Tên --- Cát --- quyết --- đập lúa --- Perc --- Err --- BP
Bob ------ -C1 ------- Inf -------- 7Per -------- 0.05 ----- 16 ----- BAC2, VBE2, AEC2
Bob ------- C2 ------ Com ------ 8Per -------- 0.45 ------ 4 ------ XBC4, ADC2
Joe -------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 3 ----- -QYC2, KSC2

Nhưng cho một phạm vi ngày 01/01/2009 đến 09/31/2011

@HansUp bạn có thể giúp với điều này?

+0

Bạn cần một chức năng người dùng định nghĩa VBA cho việc này. Allen Browne đã cung cấp một, cùng với một ví dụ chi tiết về cách sử dụng nó. http://allenbrowne.com/func-concat.html – HansUp

+0

ive đã làm theo các bước biên dịch hàm nhưng bạn có thể giúp tôi tạo câu lệnh "chọn" dựa trên những gì tôi đang tìm kiếm ở trên không? – JT2013

+0

@HansUp tôi đã sử dụng liên kết mà bạn đã đề cập đến – JT2013

Trả lời

5

Tôi đã sử dụng truy vấn con cho GROUP BY tính toán Tổng của Err cho mỗi nhóm. Sau đó, tôi đã thêm hàm ConcatRelated (from Allen Browne) với các trường được truy vấn con trả về. Đây là truy vấn và đầu ra (dựa trên số liệu mẫu của bạn trong make_table_bp) từ truy vấn:

SELECT 
    sub.[Name], 
    sub.Cat, 
    sub.[Desc], 
    sub.Thresh, 
    sub.Perc, 
    sub.SumOfErr, 
    ConcatRelated("BP", 
     "make_table_bp", 
     "[Err] > 0 AND [Name] = '" & sub.[Name] 
     & "' AND Cat = '" 
     & sub.Cat & "'", 
     "BP") 
     AS concat_BP 
FROM 
    (SELECT 
     q.[Name], 
     q.Cat, 
     q.[Desc], 
     q.Thresh, 
     q.Perc, 
     Sum(q.[Err]) AS SumOfErr 
    FROM make_table_bp AS q 
    GROUP BY 
     q.[Name], 
     q.Cat, 
     q.[Desc], 
     q.Thresh, 
     q.Perc 
    ) AS sub 
ORDER BY 
    sub.Name, 
    sub.Cat; 

Các kết quả truy vấn kết quả này thiết lập:

Name Cat Desc Thresh Perc SumOfErr concat_BP 
Bob C1 Inf 7Per 0.05  16 AEC2, BAC2, VBE2 
Bob C2 Com 8Per 0.45  4 ADC2, XBC4 
Joe C1 Inf 7Per 0.05  3 KSC2, QYC2 

Thông báo tôi kèm theo tên, quyết định, và Err với dấu ngoặc vuông mỗi vị trí mà chúng được tham chiếu trong truy vấn. Tất cả đều là những từ dành riêng (xem Problem names and reserved words in Access). Chọn các tên khác nhau cho các trường đó nếu có thể. Nếu không, hãy sử dụng các dấu ngoặc vuông để tránh nhầm lẫn với công cụ db.

Nhưng điều này sẽ không hoạt động trừ khi/cho đến khi bản sao của hàm ConcatRelated được công nhận bởi công cụ cơ sở dữ liệu của bạn. Tôi không hiểu tại sao nó không phải; Tôi đã làm theo các bước tương tự mà bạn đã liệt kê để lưu trữ mã chức năng, và điều này hoạt động tốt trên hệ thống của tôi.

Chỉnh sửa: Tôi đã thử nghiệm truy vấn đó với phiên bản của bảng, có [Err] làm kiểu dữ liệu số. Thay vào đó, âm thanh như của bạn là văn bản. Trong trường hợp đó, tôi sẽ đề nghị bạn thay đổi của bạn thành số, quá. Tôi không thấy lợi ích của việc lưu trữ các giá trị số dưới dạng văn bản thay vì số thực.

Tuy nhiên nếu bạn bị kẹt với [Err] làm văn bản, bạn có thể điều chỉnh truy vấn để giải quyết vấn đề. Thay đổi này ...

"[Err] > 0 AND [Name] = '" & sub.[Name] 

này ...

"Val([Err]) > 0 AND [Name] = '" & sub.[Name] 

Sự thay đổi ngăn chặn các "loại không phù hợp dữ liệu trong các tiêu chí khái niệm" báo lỗi khi tôi thử nghiệm với [Err] như kiểu dữ liệu văn bản. Tuy nhiên, tôi cũng thay đổi này ...

Sum(q.[Err]) AS SumOfErr 

này ...

Sum(Val(q.[Err])) AS SumOfErr 

AFAICT rằng sự thay đổi thứ hai là không thực sự cần thiết.Công cụ db dường như sẵn sàng chấp nhận các số như văn bản khi bạn yêu cầu nó để Sum() chúng. Tuy nhiên, tôi muốn chuyển chúng một cách rõ ràng thành các giá trị số hơn là phụ thuộc vào công cụ db để thực hiện dự đoán đúng cho tôi. Công cụ db có đủ các công cụ khác để giải quyết, vì vậy tôi cố gắng nói chính xác những gì tôi muốn.

Chỉnh sửa2: Nếu bạn chỉ muốn ghép nối các giá trị duy nhất, bạn có thể sửa đổi hàm ConcatRelated(). Tìm phần này của mã ...

'Build SQL string, and get the records. 
strSql = "SELECT " & strField & " FROM " & strTable 

và thay đổi nó để này ...

'Build SQL string, and get the records. 
strSql = "SELECT DISTINCT " & strField & " FROM " & strTable 
+0

khi tôi chạy ở trên tôi nhận được lỗi sau: Lỗi 3464: Loại dữ liệu không khớp trong biểu thức tiêu chí .... mỗi trường có kiểu dữ liệu Văn bản ngoại trừ trường Perc, là số – JT2013

+0

bạn là Thiên tài! Tiếng Anh> Tiếng Việt! Câu hỏi duy nhất tôi có là: có cách nào để chỉ có các bản ghi rõ ràng được tạo trong cột concat_BP không? – JT2013

+0

cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn ... tôi đã có dữ liệu chính xác theo cách tôi cần! – JT2013

Các vấn đề liên quan