คำสั่ง SQL SELECT ข้อมูลอย่างไรให้นำข้อมูลที่จากเป็นแถวมาแสดงเป็นคอมลัมภ์
ตารางต้นฉบับโครงสร้างประมาณไหนครับ
Date :
2014-01-16 13:18:38
By :
01000010
ในการแสดงผลนี้ ผมใช้ตารางทั้งหมด 4 ตาราง โดย INNER JOIN ร่วมกัน ดังนี้
1. tb_Items
2. tb_ItemPurchase
3. tb_PartlistDetails
4. tb_ProductionPlanDetails
ส่วนของ Code SQL ที่ใช้ตอนนี้นะครับ (ที่แสดงผลออกมาเป็นตารางบน ตามภาพ)
Code
With sqlcmd
.CommandText = "SELECT tb_Items.PurCode"
.CommandText &= ", tb_Items.ItemName"
.CommandText &= ", tb_Items.Barcode"
.CommandText &= ", tb_Items.ItemRack"
.CommandText &= ", tb_ItemPurchase.PurLotSize"
.CommandText &= ", tb_ItemPurchase.PurUnitName"
.CommandText &= ", tb_ItemPurchase.PurCard"
.CommandText &= ", tb_ItemPurchase.PurLeadTime"
.CommandText &= ", tb_PartlistDetails.PLQuantity" 'ชั่วคราว
.CommandText &= ", tb_ProductionPlanDetails.PlanQTY" 'ชั่วคราว
.CommandText &= ", tb_ProductionPlanDetails.SeriesCode" 'ชั่วคราว
.CommandText &= ", CASE WHEN tb_PartlistDetails.SeriesCode = tb_ProductionPlanDetails.SeriesCode THEN tb_PartlistDetails.PLQuantity * tb_ProductionPlanDetails.PlanQTY ELSE 0 END AS ResultQTYUsed"
.CommandText &= " FROM tb_Items"
.CommandText &= " INNER JOIN tb_ItemPurchase"
.CommandText &= " ON tb_Items.PurCode = tb_ItemPurchase.PurCode"
.CommandText &= " INNER JOIN tb_PartlistDetails"
.CommandText &= " ON tb_Items.PurCode = tb_PartlistDetails.PurCode"
.CommandText &= " INNER JOIN tb_ProductionPlanDetails"
.CommandText &= " ON tb_PartlistDetails.SeriesCode = tb_ProductionPlanDetails.SeriesCode"
.CommandText &= " AND tb_PartlistDetails.ModelCode = tb_ProductionPlanDetails.ModelCode"
.CommandText &= " AND tb_PartlistDetails.DesCode = tb_ProductionPlanDetails.DesCode"
.CommandText &= " AND tb_PartlistDetails.VolName = tb_ProductionPlanDetails.VolName"
.CommandText &= " WHERE tb_PartlistDetails.SeriesCode = tb_ProductionPlanDetails.SeriesCode"
.CommandText &= " AND tb_PartlistDetails.ModelCode = tb_ProductionPlanDetails.ModelCode"
.CommandText &= " AND tb_PartlistDetails.DesCode = tb_ProductionPlanDetails.DesCode"
.CommandText &= " AND tb_PartlistDetails.VolName = tb_ProductionPlanDetails.VolName"
.CommandText &= " ORDER BY tb_Items.PurCode ASC"
.Connection = dbcon
End With
คำอธิบายนะครับ
ตารางที่ 1 และ 2 คือการดึงข้อมูลมาแสดงผลปกติอันนี้ไม่มีปัญหาครับ ปัญหาจะอยู่ที่ ตาราง 3 และ 4
สำหรับตารางที่ 3 คือ ข้อมูลที่แสดงส่วนประกอบของผลิตภัณฑ์ Series หนึ่งๆ ว่ามีวัตถุดิบอะไรบ้าง
ตารางที่ 4 คือ แผนการสั่งผลิต ผลิตภัณฑ์ ครับ
การคำนวณจะเป็นอย่างนี้ครับ ดูจากตัวอย่างตารางด้านบนนะครับ บรรทัดแรก สินค้า DX Series ใช้วัตถุดิบรหัส Barcode "xxx-0027" จำนวน 1 ชิ้น เป็นส่วนประกอบ และมีแผนการสั่งผลิตสินค้า DX Series จำนวน 2 ตัว ดังนั้นช่องท้ายที่จะให้แสดงออกมาคือนำมาคูณกัน จึงเท่ากับว่าวัตถุดิบ xxx-0027 นี้ต้องใช้ 2 ตัวครับ
ไม่รู้ว่าผมอธิบายเข้าใจหรือเปล่า แต่ปัญหาคืออยากเอาชื่อ Series มาอยู่เป็นหัวคอลัมภ์แทนครับ รายการวัตถุดิบจะได้ไม่แสดงซ้ำกัน
Date :
2014-01-16 13:51:27
By :
Kunghang
ลองไปหาอ่านเกี่ยวกับ Pivot Table ดูก่อนนะครับ เดียวว่าง ๆ ผมจะมาช่วยอีกที
Date :
2014-01-16 15:01:35
By :
01000010
Code (SQL)
SELECT Barcode, [DXSeries] AS DXSeries, [STSeries] AS STSeries
FROM
(SELECT Barcode, SeriesCode, ResultQTYUsed
FROM Table1 ) ps
PIVOT
(
ResultQTYUsed
FOR SeriesCode IN
( [DXSeries], [STSeries])
) AS pvt
Date :
2014-01-17 11:18:58
By :
forfun
ดูโค๊ดคุณแล้ว มันน่า ปวดหัว ปวดใจ จริงๆๆ
มันขนาดนี้ ทำไมไม่เขียน store procedure หรือ function ละคร้าา
Date :
2014-01-17 11:30:02
By :
forfun when I am not busy
ทำตามลิ้งนี้นะ
คือจะอธิบายง่ายๆนะ ถ้าไม่เข้าใจก็ถามได้นะคือ
1. สร้างSP ขึ้นมาก่อนอันนึง ไม่รู้รู้จักป่าว SP = Store Procedure
ลองดูที่ link นี้ เราเขียนเอง เป็นสร้าง SP แบบกระจอกๆ เอาไปประยุกต์ใช้นะ
https://www.thaicreate.com/community/create-stored-procedure-sql-server.html
สิ่งที่ต้องมีภายใน SP ข้อ1. คือ ข้อมูลที่นายQuery ออกมาหมดแล้วอ่ะ แบบว่าเสร็จสมบูรณ์
แต่ว่าภายใน SP นั้น นายจะต้อง Create #temptabel แล้ว Insert ข้อมูลที่ Select มาได้ไปใน #temptabel
แล้วนายก็ต้องไปเรียกใช้ SP ใน link นี้
2. นายต้องสร้าง SP อีกอันนึงคือ SP ที่ SP ข้อ1. เรียกใช้มัน คือ SP ใน link นี้
http://www.itrain.de/knowhow/sql/tsql/pivot/sp_transform_v1_1.asp
งงม๊ะ งงก็ถามได้นะ
Date :
2014-01-17 16:47:46
By :
PiggyGirl
ทำได้แล้วครับ แต่ไม่ได้ใช้วิธี PIVOT ผมเอา ListView แสดงผล Series จากฐานข้อมูลออกมาก่อน แล้วให้ User เลือกว่าจะแสดงตัวไหนบ้าง แล้ววนลูปเอาเฉพาะตัวที่เลือก ส่วน Code ก็ใช้ Case when เหมือนเดิม แล้วให้มารวมจำนวนทั้งหมดใน Column สุดท้ายอีกที
อันนี้ Code ที่ทำครับ...
Code
With sqlcmd
.CommandText = "SELECT tb_Items.PurCode"
.CommandText &= ", tb_Items.ItemName"
.CommandText &= ", tb_Items.Barcode"
.CommandText &= ", tb_Items.ItemRack"
.CommandText &= ", tb_ItemPurchase.PurLotSize"
.CommandText &= ", tb_ItemPurchase.PurUnitName"
.CommandText &= ", tb_ItemPurchase.PurCard"
.CommandText &= ", tb_ItemPurchase.PurLeadTime"
Dim row As Integer = 0
If ListView1.CheckedItems.Count > 0 Then
For row = 0 To ListView1.Items.Count - 1
If ListView1.Items(row).Checked Then
.CommandText &= ", SUM(CASE tb_PartlistDetails.SeriesCode WHEN '" & ListView1.Items(row).SubItems(0).Text & "' THEN tb_PartlistDetails.PLQuantity * tb_ProductionPlanDetails.PlanQTY ELSE 0 END) AS '" & ListView1.Items(row).SubItems(0).Text & "'"
End If
Next
End If
.CommandText &= ", SUM(tb_PartlistDetails.PLQuantity * tb_ProductionPlanDetails.PlanQTY) AS 'QTY Total'"
.CommandText &= " FROM tb_Items"
.CommandText &= " INNER JOIN tb_ItemPurchase"
.CommandText &= " ON tb_Items.PurCode = tb_ItemPurchase.PurCode"
.CommandText &= " INNER JOIN tb_PartlistDetails"
.CommandText &= " ON tb_Items.PurCode = tb_PartlistDetails.PurCode"
.CommandText &= " INNER JOIN tb_ProductionPlanDetails"
.CommandText &= " ON tb_PartlistDetails.SeriesCode = tb_ProductionPlanDetails.SeriesCode"
.CommandText &= " AND tb_PartlistDetails.ModelCode = tb_ProductionPlanDetails.ModelCode"
.CommandText &= " AND tb_PartlistDetails.DesCode = tb_ProductionPlanDetails.DesCode"
.CommandText &= " AND tb_PartlistDetails.VolName = tb_ProductionPlanDetails.VolName"
.CommandText &= " WHERE tb_PartlistDetails.SeriesCode = tb_ProductionPlanDetails.SeriesCode"
.CommandText &= " GROUP BY tb_Items.PurCode"
.CommandText &= ", tb_Items.ItemName"
.CommandText &= ", tb_Items.Barcode"
.CommandText &= ", tb_Items.ItemRack"
.CommandText &= ", tb_ItemPurchase.PurLotSize"
.CommandText &= ", tb_ItemPurchase.PurUnitName"
.CommandText &= ", tb_ItemPurchase.PurCard"
.CommandText &= ", tb_ItemPurchase.PurLeadTime"
.CommandText &= " ORDER BY tb_Items.PurCode ASC"
.Connection = dbcon
End With
สำหรับวิธีการทำ PIVOT หรือทำ Store Procedure นั้น ผมยังค่อนข้างงงๆ อยู่ แต่ก็ถือเป็นความรู้ใหม่ของผมเลย ต้องศึกษากันหน่อยแล้ว
ตอนนี้ Code ยาวเป็นหางว่าวเลย อิอิ
ผมขอขอบคุณพี่ๆ ทุกคนเลยครับ ที่เข้ามาแนะนำแนวทางให้ครับผม
Date :
2014-01-18 07:30:37
By :
Kunghang
ตอบ 1 . SUM TOTAL ออกมาเฉพาะรายการที่เลือกเท่านั้น ต้องเพิ่ม SQL WHERE เข้าไปจ้าาาา
Date :
2014-01-20 13:23:26
By :
PiggyGirl
Load balance : Server 05