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