Hỏi về hàm tìm dữ liệu của ngày đầu tiên và ngày cuối cùng trong crosstab query

Liên hệ QC

Ha Vi

Thành viên mới
Tham gia
10/11/08
Bài viết
26
Được thích
0
Mình có bảng "sample" được link từ file excel, mình muốn thêm vô crosstab query 4 cột để tìm kiếm dữ liệu của ngày đầu tiên và ngày cuối cùng của từng loại sản phấm. Ví dụ như sản phẩm RACK INNER R có:
Cột 1: Ngày đầu tiên : 1/15/2013;
Cột 2: Số lượng ngày đầu tiên :5,000.
Cột 3:Ngày cuối cùng : 1/25/2013;
Cột 4: Số lượng ngày cuối cùng: 2,000.

các bạn giúp mình xem trong crosstab query cóhàm nào có thể tạo không nhé.

Cám ơn các bạn.
 

File đính kèm

  • Sample.rar
    159.5 KB · Đọc: 35
Mình có bảng "sample" được link từ file excel, mình muốn thêm vô crosstab query 4 cột để tìm kiếm dữ liệu của ngày đầu tiên và ngày cuối cùng của từng loại sản phấm. Ví dụ như sản phẩm RACK INNER R có:
Cột 1: Ngày đầu tiên : 1/15/2013;
Cột 2: Số lượng ngày đầu tiên :5,000.
Cột 3:Ngày cuối cùng : 1/25/2013;
Cột 4: Số lượng ngày cuối cùng: 2,000.

các bạn giúp mình xem trong crosstab query cóhàm nào có thể tạo không nhé.

Cám ơn các bạn.

Tạo 2 query riêng biệt, không dựa vào crosstab query.

1./ Query lấy ngày đầu tiên:

SELECT TOP 1 SAMPLE.delivery_date, SAMPLE.ItemCode, SAMPLE.ItemName, SAMPLE.partcode, SAMPLE.model, Sum(SAMPLE.OrderQty) AS SumOfOrderQty
FROM SAMPLE
GROUP BY SAMPLE.delivery_date, SAMPLE.ItemCode, SAMPLE.ItemName, SAMPLE.partcode, SAMPLE.model
HAVING (((SAMPLE.ItemName)="RACK INNER R"))
ORDER BY SAMPLE.delivery_date;

2./ Query lấy ngày cuối cùng:

SELECT TOP 1 SAMPLE.delivery_date, SAMPLE.ItemCode, SAMPLE.ItemName, SAMPLE.partcode, SAMPLE.model, Sum(SAMPLE.OrderQty) AS SumOfOrderQty
FROM SAMPLE
GROUP BY SAMPLE.delivery_date, SAMPLE.ItemCode, SAMPLE.ItemName, SAMPLE.partcode, SAMPLE.model
HAVING (((SAMPLE.ItemName)="RACK INNER R"))
ORDER BY SAMPLE.delivery_date DESC;
 
Hình như câu query trên chỉ cho ra một dòng kết quả.

Chủ:
Nguyên tắc của lệnh SQL là phân tích từng chi tiết nhỏ, viết query, bọc lại thành subqeury, gộp lại thành subquery lớn hơn, và kế tiếp. Sau khi đã có query chạy tốt rồi thì tìm cách tối ưu hoá để chạy cho nhanh hơn và dễ hiểu hơn.

Trường hợp của bạn không nên dùng crosstab. Bạn dùng một subquery tìm dòng tổng của ngày đầu, một subquery tìm dòng tổng của ngày cuối rồi inner join chúng lại, lấy ra 4 cột.

Query lấy ngày cuối, thường thì nguời ta dùng tuỷ vấn tự chiếu (Corelated Subquery), thủ thuật này áp dụng được cho mọi phiên bản SQL tiêu chuẩn:
SELECT ItemCode, delivery_date, OrderQty
FROM Sample S1
WHERE delivery_date IN (Select MAX(delivery_date) From Sample Where ItemCode = S1.ItemCode)

Tổng nó lại:
SELECT ItemCode, delivery_date, SUM(OrderQty) [OrderQty]
FROM Sample S1
WHERE delivery_date IN (Select MAX(delivery_date) From Sample Where ItemCode = S1.ItemCode)
GROUP BY ItemCode, delivery_date

Tương tự, query lấy ngày đầu:
SELECT ItemCode, delivery_date, SUM(OrderQty) [OrderQty]
FROM Sample S1
WHERE delivery_date IN (Select MIN(delivery_date) From Sample Where ItemCode = S1.ItemCode)
GROUP BY ItemCode, delivery_date

Nối chúng lại:
SELECT Q1.ItemCode
, Q1.delivery_date [Ngay Dau], Q1.OrderQty [Qty ND]
, Q2.delivery_date [Ngay Cuoi], Q2.OrderQty [Qty NC]
FROM
( SELECT ItemCode, delivery_date, SUM(OrderQty) [OrderQty]
FROM Sample S1
WHERE delivery_date IN (Select MIN(delivery_date) From Sample Where ItemCode = S1.ItemCode)
GROUP BY ItemCode, delivery_date ) As Q1 -- subquery lấy tổng ngày đầu
INNER JOIN
( SELECT ItemCode, delivery_date, SUM(OrderQty) [OrderQty]
FROM Sample S1
WHERE delivery_date IN (Select MAX(delivery_date) From Sample Where ItemCode = S1.ItemCode)
GROUP BY ItemCode, delivery_date ) As Q2 -- subquery lấy tổng ngày cuối
ON Q1.ItemCode = Q2.ItemCode
 
Web KT
Back
Top Bottom