Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,037

HOME > .NET Framework > Forum > คำสั่ง SQL SELECT ข้อมูลอย่างไรให้นำข้อมูลที่จากเป็นแถวมาแสดงเป็นคอมลัมภ์



 

คำสั่ง SQL SELECT ข้อมูลอย่างไรให้นำข้อมูลที่จากเป็นแถวมาแสดงเป็นคอมลัมภ์

 



Topic : 104665

Guest




ConvertRowToColumn


ตอนนี้ผม Select แล้วได้ออกมาแบบในภาพ (ตารางบน) แต่จะเห็นว่า Barcode มันซ้ำกัน เพราะ Series ไม่เหมือนกัน ผมจึงต้องการให้แสดงผลออกมาแบบในภาพ (ตารางด้านล่าง) นะครับ เพื่อแสดงผลจำนวนที่ใช้ของแต่ละ Barcode ของ Series นั้นๆ

ผมจะเขียนคำสั่ง SQL ยังไง ให้ได้ผลออกมาในรูปแบบนี้ครับ ตอนนี้ผมเขียน VB.net ใช้ฐานข้อมูล MS SQL Server 2008 อยู่ครับ



Tag : .NET, Ms SQL Server 2008, VB.NET







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2014-01-16 12:37:52 By : Kunghang View : 3442 Reply : 10
 

 

No. 1



โพสกระทู้ ( 697 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

ตารางต้นฉบับโครงสร้างประมาณไหนครับ






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-01-16 13:18:38 By : 01000010
 


 

No. 2

Guest


ในการแสดงผลนี้ ผมใช้ตารางทั้งหมด 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
 

 

No. 3



โพสกระทู้ ( 697 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

ลองไปหาอ่านเกี่ยวกับ Pivot Table ดูก่อนนะครับ เดียวว่าง ๆ ผมจะมาช่วยอีกที
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-01-16 15:01:35 By : 01000010
 


 

No. 4

Guest


ผมเจอข้อมูลจากเว็บ http://www.mssqltips.com/sqlservertip/1019/crosstab-queries-using-pivot-in-sql-server/

คิดว่าน่าจะตรงประเด็นแล้วล่ะ แต่ของผมมันมีหลายตาราง Join กัน รวมถึง Series ก็ไม่ได้ fix ตายตัว เลยนำมาเขียนเป็นคำสั่งไม่ถูกครับ ลองแล้วลองอีกก็ไม่ได้...พอจะแนะนำได้มั้ยครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-01-17 10:40:22 By : Kunghang
 


 

No. 5

Guest


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
 


 

No. 6

Guest


ดูโค๊ดคุณแล้ว มันน่า ปวดหัว ปวดใจ จริงๆๆ

มันขนาดนี้ ทำไมไม่เขียน store procedure หรือ function ละคร้าา
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-01-17 11:30:02 By : forfun when I am not busy
 


 

No. 7



โพสกระทู้ ( 29 )
บทความ ( 1 )



สถานะออฟไลน์


ทำตามลิ้งนี้นะ



คือจะอธิบายง่ายๆนะ ถ้าไม่เข้าใจก็ถามได้นะคือ
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
 


 

No. 8

Guest


ทำได้แล้วครับ แต่ไม่ได้ใช้วิธี 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
 


 

No. 9

Guest


ถามต่ออีกนิดนะครับ

1.ถ้าช่องสุดท้ายผมจะ SUM TOTAL ออกมาเฉพาะรายการที่เลือกเท่านั้น ต้องทำอย่างไรครับ ตอนนี้ที่ทำไว้มัน SUM ค่าออกมาทั้งหมด ไม่ว่าจะเลือกหรือไม่เลือก

Code
.CommandText &= ", SUM(tb_PartlistDetails.PLQuantity * tb_ProductionPlanDetails.PlanQTY) AS 'QTY Total'"


2. แล้วถ้าช่องนี้ SUM ค่าออกมาแล้ว แล้วถ้ามีค่าเป็นติดลบ อยากให้สีบรรทัดนี้เป็นสีแดง จะสามารถทำได้มั้ยครับ (ที่เป็นสีสลับเขียวอยู่ตอนนี้ ผมไปตั้งใน Properties ของ Datagrid ไว้เฉยๆนะครับ)
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-01-20 08:39:51 By : Kunghang
 


 

No. 10



โพสกระทู้ ( 29 )
บทความ ( 1 )



สถานะออฟไลน์


ตอบ 1 . SUM TOTAL ออกมาเฉพาะรายการที่เลือกเท่านั้น ต้องเพิ่ม SQL WHERE เข้าไปจ้าาาา
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-01-20 13:23:26 By : PiggyGirl
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : คำสั่ง SQL SELECT ข้อมูลอย่างไรให้นำข้อมูลที่จากเป็นแถวมาแสดงเป็นคอมลัมภ์
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 05
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่