Bạn đang gặp khó khăn trong việc lấy giá trị đơn vị (ValorUnit) của lần mua hàng cuối cùng cho mỗi mã hàng (CodItem) trong Crystal Reports? Bài viết này sẽ cung cấp cho bạn các giải pháp chi tiết, dễ hiểu bằng cả ngôn ngữ SQL và hướng dẫn trực tiếp trên Crystal Reports. Chúng tôi sẽ khám phá các phương pháp sử dụng sub-select và các hàm phân tích để giúp bạn đạt được kết quả mong muốn một cách hiệu quả nhất. Đừng bỏ lỡ!
Trong quá trình tạo báo cáo, đôi khi bạn cần lấy giá trị của một trường dựa trên một điều kiện nào đó, ví dụ như lấy giá trị của lần mua hàng cuối cùng. Trong trường hợp này, yêu cầu là lấy giá trị "ValorUnit" từ bản ghi có "DataCompra" (Ngày Mua) lớn nhất cho mỗi "CodItem".
Ví dụ, chúng ta có bảng dữ liệu sau:
CodItem | DataCompra | Qtde | ValorUnit | ValorTotal |
---|---|---|---|---|
Cod1 | 17/01/15 | 25 | 10,00 | 250,00 |
Cod1 | 09/01/15 | 35 | 20,00 | 700,00 |
Cod1 | 11/01/15 | 50 | 5,00 | 250,00 |
Cod1 | 22/01/15 | 30 | 10,00 | 300,00 |
Cod2 | 19/01/15 | 10 | 5,00 | 50,00 |
Cod2 | 15/01/15 | 15 | 10,00 | 150,00 |
Kết quả mong muốn là:
CodItem | DataCompra | Qtde | ValorUnit | ValorTotal | UltimoPreco |
---|---|---|---|---|---|
Cod1 | 17/01/15 | 25 | 10,00 | 250,00 | 10,00 |
Cod1 | 09/01/15 | 35 | 20,00 | 700,00 | 10,00 |
Cod1 | 11/01/15 | 50 | 5,00 | 250,00 | 10,00 |
Cod1 | 22/01/15 | 30 | 10,00 | 300,00 | 10,00 |
Cod2 | 19/01/15 | 10 | 5,00 | 50,00 | 5,00 |
Cod2 | 15/01/15 | 15 | 10,00 | 150,00 | 5,00 |
Có hai cách chính để giải quyết vấn đề này bằng SQL:
Cách tiếp cận này sử dụng một sub-select để lấy giá trị "ValorUnit" từ bản ghi có "DataCompra" lớn nhất cho mỗi "CodItem".
SELECT
CodItem,
DataCompra,
SUM(Qtde) AS Qtde,
ValorUnit,
ValorTotal,
(
SELECT TOP 1 S.ValorUnit
FROM SUATABELA S
WHERE S.CodItem = t.CodItem
ORDER BY DataCompra DESC
) AS UltimoPreco
FROM
SUATABELA t
WHERE
DataCompra BETWEEN '2015-01-01' AND '2015-01-31'
GROUP BY
CodItem,
DataCompra,
ValorUnit,
ValorTotal;
**Giải thích:**
Một số hệ quản trị cơ sở dữ liệu (DBMS) như Oracle và SQL Server cung cấp các hàm phân tích để giải quyết các vấn đề tương tự một cách hiệu quả hơn. Ví dụ với SQL Server:
SELECT
CodItem,
DataCompra,
SUM(Qtde) AS Qtde,
ValorUnit,
ValorTotal,
FIRST_VALUE(ValorUnit) OVER (PARTITION BY CodItem ORDER BY DataCompra DESC) AS UltimoPreco
FROM
SUATABELA
WHERE
DataCompra BETWEEN '2015-01-01' AND '2015-01-31'
GROUP BY
CodItem,
DataCompra,
ValorUnit,
ValorTotal,
DataCompra
ORDER BY CodItem, DataCompra;
**Giải thích:**
Mặc dù việc thực hiện trực tiếp trong SQL thường hiệu quả hơn, bạn vẫn có thể đạt được kết quả tương tự trong Crystal Reports bằng cách sử dụng công thức (formula).
WhilePrintingRecords;
Shared NumberVar UltimoPreco;
If OnFirstRecord Then
UltimoPreco := {YourTable.ValorUnit};
UltimoPreco;
**Lưu ý:** Giải pháp này có thể không hiệu quả bằng việc sử dụng SQL trực tiếp, đặc biệt với các bộ dữ liệu lớn.
Bài viết này đã trình bày các phương pháp khác nhau để lấy giá trị cuối cùng của một trường dựa trên một trường khác trong Crystal Reports. Sử dụng SQL với sub-select hoặc hàm phân tích thường là lựa chọn hiệu quả nhất. Tuy nhiên, nếu bạn cần thực hiện điều này trực tiếp trong Crystal Reports, bạn có thể sử dụng công thức và biến Shared. Hy vọng rằng những hướng dẫn này sẽ giúp bạn giải quyết vấn đề một cách dễ dàng và hiệu quả.
Bài viết liên quan