|  | 
	                
  
    |  |  
    | 
        
        สอบถาม sql หน่อยคับเวลาดึงข้อมูลมา 2 ตารางแล้วมันมีข้อมูลซ้ำจะให้แสดงอันเดียว     |  
    |  |  
 
              
  
    | 
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ใช้ Distinct ไม่ได้ครับ เพราะว่า ข้อมูล Qty Cost กับ Amount ไม่ซ้ำกันครับ ต้อง Sum ข้อมูลพวกนี้ออกมาก่อน แล้วใช้ Group by เอาครับ 
 |  
              | 
 ประวัติการแก้ไข
 2015-02-09 10:48:23
 2015-02-09 11:26:04
 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-09 10:37:49 | By :
                            thaidevelopment.net |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ผมลองละ ถ้ามี inner join  มันจะไม่ได้ใช่ไหมคับ 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-09 14:21:04 | By :
                            TheCom |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ไม่เกี่ยวกับ Inner Join ครับ ลองดูสีแดงครับ ข้อมูลมันแตกต่างกัน มันเลยใช้ Distinct ไม่ได้ครับ 
 
 
  
 |  
              | 
 ประวัติการแก้ไข
 2015-02-09 14:40:55
 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-09 14:40:36 | By :
                            Thaidevelopment.NET |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ผมลองลบ Qty cost Amount  ละก็ Price ออกมันได้ 
 แต่ผมต้องการข้อมูล 4 ตัวนี้ด้วย
 Qty cost Amount  ละก็ Price
 ต้องทำไงคับ
 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-09 16:12:36 | By :
                            TheCom |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ถ้าให้ออกมา Row เดียวแล้วไม่ซ้ำทำไม่ได้ครับ แต่ถ้าให้มันออกมา Row เดียวได้ จะต้องใช้ SUM ครับ 
 |  
              | 
 ประวัติการแก้ไข
 2015-02-09 16:15:42
 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-09 16:15:00 | By :
                            Thaidevelopment.NET |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | พอมี ตย.ไหมคับ ข้อมูลจิงๆ ที่ไม่ซำ้กับจะมี 4 บรรทัด
 
 |  
              | 
 ประวัติการแก้ไข
 2015-02-09 16:21:23
 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-09 16:20:26 | By :
                            TheCom |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ลองดูตามรูปด้านล่างครับ 
 
  
 
 มันจะนำข้อมูลที่ไม่ซ้ำกันมารวมกันก่อนโดยใช้ SUM ครับ
 
 |  
              | 
 ประวัติการแก้ไข
 2015-02-09 16:55:01
 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-09 16:54:02 | By :
                            Thaidevelopment.NET |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | แต่เวลาเราออก Report ข้อมูลมันจะแยกให้เหมือนเดิมไหมคับ 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-09 17:18:20 | By :
                            TheCom |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ต้องถามก่อนว่า 4 รายการนั้นจะให้โชว์ รายการไหน ครับ รายการน้อยสุดหรือมากสุด min( fld ) หรือ max( fld )
 
 ตัวอย่างนี้เป็นการเลือกมา 1 รายการ ที่มากที่สุด
 
 group_name คือ ชื่อฟีลด์ที่ใช้กำหนด group
 fld คือชื่อฟีลด์ที่ใช้เลือก
 
 Code (SQL)
 
 
select tb.* from (
     select group_name, max(fld) mx_fld
     from tablename  
     group by group_name
) as tmp
left join tablename as tb 
on tmp.mx_fld = tb.fld and tmp.group_name=tb.group_name 
 |  
              | 
 ประวัติการแก้ไข
 2015-02-09 17:40:21
 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-09 17:39:06 | By :
                            Chaidhanan |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
 
        
          |  |  |  |  |  
          |  |  | 
            
              | มีวิธีไหนอีกไหมคับ  คือผมต้องดึงข้อมูลแล้วเอาไปออกที่ Report อีกที ข้อมูลมันซ้ำกันอะ ปิดข้อมูลซ้ำที่ report ก็ปิดแล้ว
 
 
 ใครมีวิธีไหนแนะนำบ้างคับ
 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-10 17:08:32 | By :
                            TheCom |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | และอะไรเป็นเกณฑ์วัดว่าเป็นข้อมูลจริงครับ 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-10 19:47:54 | By :
                            Chaidhanan |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | "ใครมีวิธีไหนแนะนำบ้างคับ" ---- 1. ทำความเข้าใจกับ SQL Query Language (ใส่ใจและหมั่นฝึกฝน)
 ------- ทำเรื่องง่ายฯให้เป็นเรื่องยากและทำเรื่องยากฯให้เป็นเรื่องง่ายฯ อย่างคล่องแคล่ว
 
 แต่ถ้าข้อที่ 1. คุณไม่สะดวก ก็นี่เลย "หนามยอกเอาหนามบ่ง" จาก #NO3
 ถ้าคุณใช้ DataTable และต้องการเอาแถวที่ซ้ำกันออก
 
 Code (VB.NET)
 
 Dim tmpDT_Report  = yourDataTable.DefaultView.ToTable(True, {"DocNO", "Price", "JobNO", "ตามที่ต้องการ"})
'เอาไปออกรายงานได้เลย
 
 ปล. True == Distincnt
 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-11 06:56:43 | By :
                            หน้าฮี |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              |  ตอบความคิดเห็นที่ : 13 เขียนโดย : หน้าฮี เมื่อวันที่ 2015-02-11 06:56:43 
 รายละเอียดของการตอบ ::
 
เอาใส่ตรงไหนเหรอคับ ไม่รู้จิงๆ  ใส่ไม่ถูกจุด
Code (VB.NET)  sql = "SELECT dbo.BCStkIssueSub.DocNo, "
        sql &= " dbo.BCStkIssueSub.Price, dbo.BCStkIssueSub.JobNo, "
        sql &= " dbo.BCFinishGoodsSub.ItemCode, dbo.BCFinishGoodsSub.ItemName, "
        sql &= " dbo.BCFinishGoodsSub.WHCode, dbo.BCFinishGoodsSub.Qty, dbo.BCFinishGoodsSub.Cost, dbo.BCFinishGoodsSub.Amount, "
        sql &= " dbo.BCFinishGoodsSub.JobNo, dbo.BCFinishGoodsSub.unitname, dbo.BCFinishGoodsSub.sum_qfeet, "
        sql &= " dbo.BCFinishGoodsSub.sum_Amount, dbo.BCStkIssue.JobNo"
        sql &= " FROM dbo.BCStkIssueSub INNER JOIN"
        sql &= " dbo.BCStkIssue ON dbo.BCStkIssueSub.DocNo = dbo.BCStkIssue.DocNo INNER JOIN"
        sql &= " dbo.BCFinishGoodsSub ON dbo.BCStkIssueSub.DocNo = dbo.BCFinishGoodsSub.DocNo AND dbo.BCStkIssueSub.JobNo = dbo.BCFinishGoodsSub.JobNo"
        sql &= " where BCStkIssueSub.DocNo = '" & CboDocno.Text & "'"
        da = New SqlDataAdapter(sql, cn)
        dt4 = New DataTable
        da.Fill(dt4)
        Dim frmr1 As New FrmViewReport
        Dim rp3 As New CrystalReport8
        rp3.Database.Tables(0).SetDataSource(dt4)
        ':::::::::::::เปิด Report โดยไม่ถามรหัสผ่าน:::::::::::::::::::::
        Dim strDataReport As String = ""
        Dim crtable As CrystalDecisions.CrystalReports.Engine.Table
        Dim crTableLogonInto As CrystalDecisions.Shared.TableLogOnInfo
        Dim cnConnInto As New CrystalDecisions.Shared.ConnectionInfo
        With cnConnInto
            cnConnInto.ServerName = "server2005"
            cnConnInto.DatabaseName = Database_csw.Trim
            cnConnInto.UserID = "sa"
            cnConnInto.Password = "1234"
        End With
        For Each crtable In rp3.Database.Tables
            crTableLogonInto = crtable.LogOnInfo
            crTableLogonInto.ConnectionInfo = cnConnInto
            crtable.ApplyLogOnInfo(crTableLogonInto)
        Next
        frmr1.objrp = rp3
        frmr1.Show()
 |  
              | 
 ประวัติการแก้ไข
 2015-02-11 17:43:16
 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-11 17:27:24 | By :
                            TheCom |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ดูเหมือนประเด็นไม่ได้เกี่ยวกะ SQL เลยนะครับเนี๊ยะ มันเป็นเรื่องข้อมูลล้วนๆ
 
 วิธีง่ายๆที่จะบอกได้คือ ลองใช้ข้อมูลอื่นที่ไม่ใช่
 
 AB01-5802-0015 ดูครับ
 
 ขืนยังเอาข้อมูลนี้มาอีก น่าจะอีกนานครับถึงจะแก้ได้
 เพราะผมดูยังไงข้อมูลโดยรวมก็ไม่เหมือนกันอยู่ดี
 
 วิธีบ้านๆคือ แยกประเด็นออกเป็น 2 แบบ คือ
 1. เกิดจาก SQL
 2. เกิดจากข้อมูล
 
 จะได้แก้ปัญหาให้ตรงจุดครับ
 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-11 18:09:41 | By :
                            lamaka.tor |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | เอาใส่ตรงไหนเหรอคับ ไม่รู้จิงๆ ใส่ไม่ถูกจุด 
 จาก #NO 14 บรรทัดที่ 17 ใส่แบบนี้ครับ
 
 Code (VB.NET)
 
 '***** ดูจากข้อมูลใช้แค่ Field ItemCode ก็น่าจะพอ
rp3.Database.Tables(0).SetDataSource(dt4.DefaultView.ToTable(True, {"ItemCode"}))
 
 ข้อสังเกตุ *****
 
 คำสั่ง SQL Query และข้อมูลที่คุณนำมาแสดง อนุมานได้ว่า
 คุณพยายามจะ Group By ด้วยคอลัมภ์เดียว แต่คุณเลือกมาหลายฯคอลัมน์ (มากกว่า Group By)
 
 ยกตัวอย่างเช่น
 Code (SQL)
 
 
Select Field1, Field2, Field3 From TableXXX Group By Field1
/* มันไม่ถูกต้อง*/
 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-11 20:19:42 | By :
                            หน้าฮี |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ย้อนกลับไปที่ #NO 13  ข้อที่ 1. 
 เพื่อหาสาเหตุว่า ข้อมูลมันซ้ำกันได้อย่างไร (มีมากกว่าเดิม)
 
 สรุปให้ก็ได้ว่า มันเกิดจากการ JOIN (Inner Join / Left Join / Right Join / Other Join)  โดย Many To Many
 
 ตัวอย่างประกอบความเข้าใจจาก http://sqlity.net/en/1163/a-join-a-day-the-inner-join/
 
 
 Code (SQL)
 
 
USE tempdb
GO
CREATE TABLE dbo.TblA(TblA_Val INT, TblA_Desc VARCHAR(MAX));
CREATE TABLE dbo.TblB(TblB_Val INT, TblB_Desc VARCHAR(MAX));
 
INSERT INTO dbo.TblA(TblA_Val, TblA_Desc)
VALUES (1,'A-1'),
       (2,'A-2'),
       (3,'A-3 (1st)'),
       (3,'A-3 (2nd)'),
       (4,'A-4 (1st)'),
       (4,'A-4 (2nd)'),
       (5,'A-5');
        
INSERT INTO dbo.TblB(TblB_Val, TblB_Desc)
VALUES (2,'B-2'),
       (3,'B-3'),
       (4,'B-4 (1st)'),
       (4,'B-4 (2nd)'),
       (5,'B-5 (1st)'),
       (5,'B-5 (2nd)'),
       (6,'B-6');
       
SELECT *
FROM dbo.TblA AS A
INNER JOIN dbo.TblB AS B
ON A.TblA_Val = B.TblB_Val;
DROP TABLE dbo.TblA
DROP TABLE dbo.TblB
 ผลลัพธ์ที่ได้ 9 ระเบียน (Row) จะเห็นว่ามันมีมากกว่าเดิม
 
 
 วิธีแก้ไข JOIN Many To Many  โดยใช้คำสั่ง CROSS APPLY
 
 
 Code (SQL)
 
 
USE tempdb
GO
CREATE TABLE dbo.TblA(TblA_Val INT, TblA_Desc VARCHAR(MAX));
CREATE TABLE dbo.TblB(TblB_Val INT, TblB_Desc VARCHAR(MAX));
 
INSERT INTO dbo.TblA(TblA_Val, TblA_Desc)
VALUES (1,'A-1'),
       (2,'A-2'),
       (3,'A-3 (1st)'),
       (3,'A-3 (2nd)'),
       (4,'A-4 (1st)'),
       (4,'A-4 (2nd)'),
       (5,'A-5');
        
INSERT INTO dbo.TblB(TblB_Val, TblB_Desc)
VALUES (2,'B-2'),
       (3,'B-3'),
       (4,'B-4 (1st)'),
       (4,'B-4 (2nd)'),
       (5,'B-5 (1st)'),
       (5,'B-5 (2nd)'),
       (6,'B-6');
       
SELECT * FROM dbo.tblA A CROSS APPLY (SELECT TOP 1 * FROM TblB WHERE TblB.Tblb_Val= A.TblA_Val ORDER BY 2 DESC) B
DROP TABLE dbo.TblA
DROP TABLE dbo.TblB
 
 
 ลองทำความเข้าใจดูครับ (รู้ที่มาและรู้ที่ไปเสมอ)
 
 
 
 นักปราชญ์ผูกพันกันด้วยคุณธรรม เหตุดังนี้จึงอ่อนโยนคล้ายสายวารี
 สามัญชนผูกพันกันด้วยผลประโยชน์ เหตุดังนี้จึงมากมายคล้ายเมรัย
 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-12 05:54:28 | By :
                            หน้าฮี |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
 
        
          |  |  |  |  |  
          |  |  | 
            
              |  ตอบความคิดเห็นที่ : 19 เขียนโดย : Chaidhanan เมื่อวันที่ 2015-02-12 08:38:40 
 รายละเอียดของการตอบ ::
 
ข้อมูลจาก 2 ตารางที่ต้องการคับ 
   
output ที่ต้องการ ให้ 2 ตารางนี้รวมกันแล้วออกมา 4 บรรทัดเหมือนเดิมคับ 
 
code ชุดนี้ที่ใช้ดึงข้อมูลแล้วเอาไปออกรายงาน 
Code (VB.NET)  sql = "SELECT dbo.BCStkIssueSub.DocNo, "
        sql &= " dbo.BCStkIssueSub.Price, dbo.BCStkIssueSub.JobNo, "
        sql &= " dbo.BCFinishGoodsSub.ItemCode, dbo.BCFinishGoodsSub.ItemName, "
        sql &= " dbo.BCFinishGoodsSub.WHCode, dbo.BCFinishGoodsSub.Qty, dbo.BCFinishGoodsSub.Cost, dbo.BCFinishGoodsSub.Amount, "
        sql &= " dbo.BCFinishGoodsSub.JobNo, dbo.BCFinishGoodsSub.unitname, dbo.BCFinishGoodsSub.sum_qfeet, "
        sql &= " dbo.BCFinishGoodsSub.sum_Amount, dbo.BCStkIssue.JobNo"
        sql &= " FROM dbo.BCStkIssueSub INNER JOIN"
        sql &= " dbo.BCStkIssue ON dbo.BCStkIssueSub.DocNo = dbo.BCStkIssue.DocNo INNER JOIN"
        sql &= " dbo.BCFinishGoodsSub ON dbo.BCStkIssueSub.DocNo = dbo.BCFinishGoodsSub.DocNo AND dbo.BCStkIssueSub.JobNo = dbo.BCFinishGoodsSub.JobNo"
        sql &= " where BCStkIssueSub.DocNo = '" & CboDocno.Text & "'"
ดึงได้ปกติ แต่มันจะมีปัญหาตรงที่ ว่าทำไมผมถึงเอา AB01-5802-0015 มาให้ดู 
ถ้าตารางแรกมี Jobno 01 01 01 ซึ้ำกัน เวลาใช้ Code ชุดนี้ มันจะ ดึงออกมาเยอะมาก 
แต่ถ้า Jobno  ตารางแรก เป็น 01 02 03 ไม่มีปัญหาเพราะไม่ซ้ำกัน
ตารางที่ 2 จะซ้ำกันหรือไม่ซ้ำก็ไม่มีปัญหา
 |  
              | 
 ประวัติการแก้ไข
 2015-02-12 10:14:14
 2015-02-12 10:20:00
 2015-02-12 10:41:19
 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2015-02-12 10:13:21 | By :
                            TheCom |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  |  |