SELECT a.CustomerCode as Customer,b.Itemcode as Item, sum(b.qtyorder) AS total_qty FROM SO a INNER JOIN
SO_Detail b ON a.SOID = b.SOID
group by a.CustomerCode,b.Itemcode
///// อันนี้คือหาค่า sum จำนวนที่สั่งซื้อค่ะ
ผลลัพธ์จะได้แบบนี้ค่ะ
customer : Itemcode : total_qty
001 : 1 : 10
002 : 1 : 12
003 : 1 : 15
001 : 2 : 20
003 : 2 : 15
-------------------------------
แล้วทีนี้ต้องการดึงข้อมูลที่มีค่ามากสุดของแต่ละ item ออกมาค่ะ จะต้องได้แบบนี้ค่ะ
003 : 1 : 15
001 : 2 : 20
และต้อง นับจำนวนของแต่ละ item ว่ามี customer กี่คน ผลลัพธ์สุดท้ายก็จะได้
cusmain : itemcode : total_qty : total_cus
003 : 1 : 15 : 3
001 : 2 : 20 : 2
---------------------------------
เลยเขียนแบบนี้ไว้ค่ะ
select max(total_qty) as CusMain,customer,item,count(total_qty) as total_cus
from (SELECT a.CustomerCode as customer,b.itemcode as item, sum(b.qtyorder) AS total_amt
FROM SO a INNER JOIN
SO_Detail b ON a.SOID = b.SOID
group by a.CustomerCode,b.itemcode) SUMCusMain
group by customer,item
แต่ว่ามันผิดค่ะ มันเล่นเอาข้อมูลออกมาอย่างละเรคคอร์ด ไม่ได้ดึงค่า max ออกมาค่ะ เพราะว่ามันติด group by
แต่พอไม่ใส่ group by มันก็ error ว่า
Column 'SUMCusMain.customer' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
เนื่องจากไม่มีตารางของคุณ เลยจำลอง
SELECT a.CustomerCode as Customer,b.Itemcode as Item, sum(b.qtyorder) AS total_qty FROM SO a INNER JOIN
SO_Detail b ON a.SOID = b.SOID
group by a.CustomerCode,b.Itemcode
ทั้งก้อนเปนตารางนึงแล้วจัดเก็บไว้ใน View ของ MSSQL
ซึ่งแนะนะให้คุณเอาทั้งก้อน นี้ไปเก็บไว้ใน VIEW ด้วยเช่นกันค่ะ
เพื่อลดความซับซ้อนในการสร้าง QUERY ต่อไป
จากนั้นก็ Solved หาวิธี ซึ่งก้อทำจนออกมาเป็นผลลัพธ์ที่คุณต้องการได้นะคะ
แต่ ใน Query ของคุณมีข้อขัดแย้งอยู่ซึ่ง เนื่องจากว่าไม่ใช่คนออกแบบ
จึงไม่อาจคาดเดาไปมากกว่านี้ เดี๋ยวจะชี้ให้ดูค่ะว่าขัดแย้งกันอย่างไร
อาจะยาวนะคะ
// ****************** ใน View ******************
SELECT QR_FIRST.*
,row_number()
OVER (ORDER BY QR_FIRST.Item_code
,QR_FIRST.total ,QR_FIRST.customer_code) AS dynamic_id
FROM
(
SELECT a.CustomerCode as customer_code
,b.Itemcode as Item_code, sum(b.qtyorder) AS total
FROM SO a INNER JOIN SO_Detail b
ON a.SOID = b.SOID
GROUP BY b.Itemcode ,a.CustomerCode
) AS QR_FIRST
ORDER BY QR_FIRST.Item_code ,QR_FIRST.total ,QR_FIRST.customer_code
// ***********************************
View นี้ให้ชื่อว่า ViewGetMaxItem ค่ะ
และที่ Command จะเขียนดังนี้ ( ไม่ต้องการ Field ไหนก็ลบออกนะคะ )
SELECT
CASE
WHEN QR_MAX.first_rec_id = QR_CUSTOMER.dynamic_id
THEN CONVERT(VARCHAR(50) ,QR_MAX.item_code)
ELSE ''
END AS item_code_label
,QR_CUSTOMER.item_code,QR_CUSTOMER.CUSTOMER_CODE as custmain
,QR_MAX.max_item ,QR_MAX.total_customer
,CASE
WHEN QR_MAX.first_rec_id = QR_CUSTOMER.dynamic_id
THEN QR_MAX.max_item
ELSE 0
END AS filter_max_item
,CASE
WHEN QR_MAX.first_rec_id = QR_CUSTOMER.dynamic_id
THEN QR_MAX.total_customer
ELSE 0
END AS filter_total_customer
,CASE
WHEN QR_MAX.first_rec_id = QR_CUSTOMER.dynamic_id
THEN ''
ELSE 'Not include by same maximum order'
END AS comment
FROM dbo.ViewGetMaxItem AS QR_CUSTOMER
RIGHT JOIN
(
SELECT QR_INNER.item_code, MAX(QR_INNER.total) AS max_item
,COUNT(QR_INNER.customer_code) AS total_customer
,MIN(QR_INNER.dynamic_id) as first_rec_id
FROM dbo.ViewGetMaxItem AS QR_INNER
GROUP BY QR_INNER.item_code
) AS QR_MAX
ON (QR_CUSTOMER.item_code=QR_MAX.item_code)
AND (QR_CUSTOMER.total = QR_MAX.max_item)
ORDER BY QR_CUSTOMER.item_code ,QR_CUSTOMER.CUSTOMER_CODE;
row_number เป็น function ใน sql sever 2005 ขึ้นมา
ตัวอย่างที่เขียนให้ทำด้วย MS SQL SERVER
ถ้าเป็น MySQL หรือ PostgreSQL จะเขียนแตกต่างออกไป
ไม่ทราบใช้ฐานข้อมูลอะไรคะ