SUBQUERY BÁO LỖI :(

Liên hệ QC

Tăng Vĩnh Hòa

Thành viên mới
Tham gia
1/6/17
Bài viết
19
Được thích
1
Giới tính
Nam
Các Thầy ơi, cho em hỏi, em đang dùng ADO để truy vấn báo cáo. Em viết đoạn code subquery sua đây mà nó cứ báo lỗi:
"Runtime error '-2147217900 (80040e14)
Syntax error in FROM clause"

Đoạn code bị lỗi:
tbl1 = "TRANSFORM SUM(DTTH) " & _
"SELECT VUNG, CN, TINH, HUYEN " & _
"FROM (SELECT NAM, VUNG, CN, TINH, HUYEN, DTTH FROM [data2016$] " & _
"UNION ALL SELECT NAM, VUNG, CN, TINH, HUYEN, DTTH FROM [data2017$] " & _
"UNION ALL SELECT NAM, VUNG, CN, TINH, HUYEN, DTTH FROM [data2018$]) " & _
"GROUP BY VUNG, CN, TINH, HUYEN " & _
"PIVOT NAM"

rcs1.Open ("SELECT * FROM (" & tbl1 & ")"), cn

==>Em thử sửa lại dấu ngoặc tròn thành ngoặc vuông rcs1.Open ("SELECT * FROM [" & tbl1 & "]"), cn thì nó báo lỗi "syntax error in union query".

--> Em chưa biết là mình có lồng được 2 subquery như vậy được hay không ạ?
Mong các Thầy giúp đỡ! Em cảm ơn.
 
Tự hình dung ra CSDL của bạn rồi mày mò thử rút ra kết luận là hình như 1 TRANSFORM không có thể là 1 subquery(Tăng Vĩnh Hòa thực chất tìm ra chân lý ấy rồi nhưng mình ngu ngu thử lại :unknw:). Tuy nhiên bạn hoàn toàn truy xuất được dữ liệu bằng cách sau
PHP:
    For Each fld In rcs1.Fields
        Debug.Print fld.Name
    Next
    While Not rcs1.EOF
        Debug.Print rcs1.Fields("VUNG").Value, rcs1.Fields("cn").Value, rcs1.Fields("tinh").Value, rcs1.Fields("2016").Value, rcs1.Fields("2017").Value, rcs1.Fields("2018").Value,
        Debug.Print ""
        rcs1.MoveNext
    Wend
 
Lần chỉnh sửa cuối:
Các Thầy ơi, cho em hỏi, em đang dùng ADO để truy vấn báo cáo. Em viết đoạn code subquery sua đây mà nó cứ báo lỗi:
"Runtime error '-2147217900 (80040e14)
Syntax error in FROM clause"

Đoạn code bị lỗi:
tbl1 = "TRANSFORM SUM(DTTH) " & _
"SELECT VUNG, CN, TINH, HUYEN " & _
"FROM (SELECT NAM, VUNG, CN, TINH, HUYEN, DTTH FROM [data2016$] " & _
"UNION ALL SELECT NAM, VUNG, CN, TINH, HUYEN, DTTH FROM [data2017$] " & _
"UNION ALL SELECT NAM, VUNG, CN, TINH, HUYEN, DTTH FROM [data2018$]) " & _
"GROUP BY VUNG, CN, TINH, HUYEN " & _
"PIVOT NAM"

rcs1.Open ("SELECT * FROM (" & tbl1 & ")"), cn

==>Em thử sửa lại dấu ngoặc tròn thành ngoặc vuông rcs1.Open ("SELECT * FROM [" & tbl1 & "]"), cn thì nó báo lỗi "syntax error in union query".

--> Em chưa biết là mình có lồng được 2 subquery như vậy được hay không ạ?
Mong các Thầy giúp đỡ! Em cảm ơn.
Sao không đổ kết quả luôn mà mình phải select lại
Mã:
rcs1.Open (tbl1), cn
 
Sao không đổ kết quả luôn mà mình phải select lại
Mã:
rcs1.Open (tbl1), cn
Dạ tại vì mẫu báo cáo của em như hình bên dưới đây.
Em thử đỗ báo cáo ra như Thầy nói thì nó ra đúng từ cột A đến G.
Còn cột H (tính toán tăng trưởng) em loay hoay mãi không biết làm sao để lồng vào cái tbl1 luôn, nên thử dùng cách SELECT lại cái tbl1, rồi chèn vào 1 cột tính tăng trưởng nhưng cứ báo lỗi như em đang thắc mắc.
Mặt khác, em thử dùng 2 recordset thì được. Nghĩa là em đỗ tbl1 ra 1 sheet, rồi SELECT cái sheet này và chèn thêm cột tính tăng trưởng, cuối cùng đỗ kết quả lại vào báo cáo như hình dưới --> nhưng mà lằng nhằng quá, em muốn làm 1 recordset thôi mà lỗi hoài Thầy ơi @Hai Lúa Miền Tây ......... :(((((
Untitled.png
 
Lần chỉnh sửa cuối:
Dạ tại vì mẫu báo cáo của em như hình bên dưới đây.
Em thử đỗ báo cáo ra như Thầy nói thì nó ra đúng từ cột A đến G.
Còn cột H (tính toán tăng trưởng) em loay hoay mãi không biết làm sao để lồng vào cái tbl1 luôn, nên thử dùng cách SELECT lại cái tbl1, rồi chèn vào 1 cột tính tăng trưởng nhưng cứ báo lỗi như em đang thắc mắc.
Mặt khác, em thử dùng 2 recordset thì được. Nghĩa là em đỗ tbl1 ra 1 sheet, rồi SELECT cái sheet này và chèn thêm cột tính tăng trưởng, cuối cùng đỗ kết quả lại vào báo cáo như hình dưới --> nhưng mà lằng nhằng quá, em muốn làm 1 recordset thôi mà lỗi hoài Thầy ơi @Hai Lúa Miền Tây ......... :(((((
View attachment 205384
Vậy thì tính toán tăng trưởng trước rồi sau đó mình dùng CrossTab Query.
 
Vậy thì tính toán tăng trưởng trước rồi sau đó mình dùng CrossTab Query.
Em chưa hiểu ý Thầy @Hai Lúa Miền Tây?!
Database của em có 3 năm, nằm ở 3 sheet thì sao mình tính tăng trưởng trước được Thầy?
Em nghĩ mình cần đỗ nó ra xong, có số tổng theo 4 điều kiện rồi mới tính được tăng trưởng theo 4 điều kiện mà đã GROUP BY trong tbl1.
Thầy chỉ giáo!
 
CrossTab Query là loại tốt rất nhiều năng lượng. Vì vậy cái SQL engine nó buộc phải có một số điều kiện để cho nó biết khi Pivot.
Khi cái query vòng ngoài gặp crosstab thì nó khựng lại vì nó không biết trước được số cột để query.
Trong Access, cách thông thường ngừoi ta dùng là save crosstab lại và select từ đó. Select * From myCrossTab...
 
Em chưa hiểu ý Thầy @Hai Lúa Miền Tây?!
Database của em có 3 năm, nằm ở 3 sheet thì sao mình tính tăng trưởng trước được Thầy?
Em nghĩ mình cần đỗ nó ra xong, có số tổng theo 4 điều kiện rồi mới tính được tăng trưởng theo 4 điều kiện mà đã GROUP BY trong tbl1.
Thầy chỉ giáo!
Hòa làm 1 file mẫu giả lập dữ liệu, có cả kết quả mong muốn rồi gửi lên xem thử nhé.
 
Hòa làm 1 file mẫu giả lập dữ liệu, có cả kết quả mong muốn rồi gửi lên xem thử nhé.
Dạ Thầy @Hai Lúa Miền Tây
Để em tạo database giả lập rồi em gửi lên các Thầy xem giúp.
Em xì khói cả tuần nay...
Bài đã được tự động gộp:

CrossTab Query là loại tốt rất nhiều năng lượng. Vì vậy cái SQL engine nó buộc phải có một số điều kiện để cho nó biết khi Pivot.
Khi cái query vòng ngoài gặp crosstab thì nó khựng lại vì nó không biết trước được số cột để query.
Trong Access, cách thông thường ngừoi ta dùng là save crosstab lại và select từ đó. Select * From myCrossTab...
Em cũng đang nghĩ theo hướng SELECT từ cái crosstab đó Thầy @VetMini
Mà em làm excel chứ không phải access, nó báo lỗi hoài.
Em không biết có phải tại mấy cái ngoặc không nữa :-D
 
Dạ Thầy @Hai Lúa Miền Tây
Để em tạo database giả lập rồi em gửi lên các Thầy xem giúp.
Em xì khói cả tuần nay...
Bài đã được tự động gộp:


Em cũng đang nghĩ theo hướng SELECT từ cái crosstab đó Thầy @VetMini
Mà em làm excel chứ không phải access, nó báo lỗi hoài.
Em không biết có phải tại mấy cái ngoặc không nữa :-D
Không thể lồng cái CrossTab Query đó như trên được đâu nhé. Để xem Hòa gửi file lên rồi mới tính tiếp được.
 
Thử dùng hàm IIF xem sao nhé.
Mã:
    tbl1 = "SELECT VUNG, CN, TINH, HUYEN, sum([2016]) as 2016,sum([2017]) as 2017,sum([2018]) as 2018 " & _
            "FROM (SELECT NAM, VUNG, CN, TINH, HUYEN, iif(nam=2016,DTTH,0) as 2016 , iif(Nam=2017,DTTH,0) as 2017, iif(Nam=2018,DTTH,0) as 2018 FROM [data2016$] " & _
            "UNION ALL SELECT NAM, VUNG, CN, TINH, HUYEN, iif(nam=2016,DTTH,0) as 2016 , iif(Nam=2017,DTTH,0) as 2017, iif(Nam=2018,DTTH,0) as 2018 FROM [data2017$] " & _
            "UNION ALL SELECT NAM, VUNG, CN, TINH, HUYEN, iif(nam=2016,DTTH,0) as 2016 , iif(Nam=2017,DTTH,0) as 2017, iif(Nam=2018,DTTH,0) as 2018 FROM [data2018$]) " & _
            "GROUP BY VUNG, CN, TINH, HUYEN "
 
Thử dùng hàm IIF xem sao nhé.
Mã:
    tbl1 = "SELECT VUNG, CN, TINH, HUYEN, sum([2016]) as 2016,sum([2017]) as 2017,sum([2018]) as 2018 " & _
            "FROM (SELECT NAM, VUNG, CN, TINH, HUYEN, iif(nam=2016,DTTH,0) as 2016 , iif(Nam=2017,DTTH,0) as 2017, iif(Nam=2018,DTTH,0) as 2018 FROM [data2016$] " & _
            "UNION ALL SELECT NAM, VUNG, CN, TINH, HUYEN, iif(nam=2016,DTTH,0) as 2016 , iif(Nam=2017,DTTH,0) as 2017, iif(Nam=2018,DTTH,0) as 2018 FROM [data2017$] " & _
            "UNION ALL SELECT NAM, VUNG, CN, TINH, HUYEN, iif(nam=2016,DTTH,0) as 2016 , iif(Nam=2017,DTTH,0) as 2017, iif(Nam=2018,DTTH,0) as 2018 FROM [data2018$]) " & _
            "GROUP BY VUNG, CN, TINH, HUYEN "
@Hai Lúa Miền Tây Ngon lành Thầy ơi.
Em hiểu em ngu chỗ nào rồi, thay vì union all để 1 cột DTTH nó không hiểu thí mình đỗ ra 3 cột DTTH
Cảm ơn Thầy! :D
P/s: Em còn mấy cột sau nữa để ngâm cứu tiếp hehe...
 
Lưu ý nếu dữ liệu từng sheet không có năm khác lẫn lộn thì không cần dùng hàm IIF nhé.
Trong bảng union all, làm xong mình có 3 cột doanh thu của 3 năm, giả sử em muốn thêm vào 3 cột doanh thu nữa (cũng là 3 năm này luôn), nhưng kèm thêm 1 điều kiện về kênh phân phối nữa (ví dụ là POS) thì với câu lệnh trên mình chèn thêm cột vào với công thức IIF phải không Thầy @Hai Lúa Miền Tây?
... , IIF([Nam] = 2016 and [KenhPP] = 'POS', [DTTH], 0), ...
 
Trong bảng union all, làm xong mình có 3 cột doanh thu của 3 năm, giả sử em muốn thêm vào 3 cột doanh thu nữa (cũng là 3 năm này luôn), nhưng kèm thêm 1 điều kiện về kênh phân phối nữa (ví dụ là POS) thì với câu lệnh trên mình chèn thêm cột vào với công thức IIF phải không Thầy @Hai Lúa Miền Tây?
... , IIF([Nam] = 2016 and [KenhPP] = 'POS', [DTTH], 0), ...
Đúng là phải như vậy đó Hòa ơi, cố gắng luyện càng nhiều càng tốt nhé.
 
Web KT
Back
Top Bottom