|  | 
	                
  
    |  |  
    | 
        
        SQL Serverข้อมูลที่ join กัน มีค่าซ้ำกัน รบกวนช่วยดู Code ทีจ้า     |  
    |  |  
 
	
		|  |  |  |  |  
		|  |  | 
          
            | ทำใน SQL Server ค่ะ ต้องการให้ข้อมูลที่เราเลือก ในช่วงเวลานั้นๆออกมาแสดงผล ตามต้องการ ซึ่งที่เขียนมา เวลาออกมาถูกแล้ว แต่ฟิลด์อื่นๆที่ต้องแสดงพร้อมกับเวลา เกิดมีค่าซ้ำกัน
 ต้องแก้ตรงไหนอะค่ะ ติดอยู่หลายวันนานมากกกก รบกวนช่วยดู Code ให้ทีนะคะ T_T
 
 Code (ASP)
 
 SELECT DISTINCT tm.mDatetime as ‘เวลา’,tm.tMoney as ‘เงิน’,tl.usrID as ‘รหัส’,tid.nameID as ‘ชื่อ’
From tableMoney tm inner join tableLogin tl on CONVERT(nvarchar(10),tm.mDatetime,126)=CONVERT(nvarchar(10),tl.startTime,126)
inner join tableID tid on tid.caUser_ID=tl.usrID
WHERE CONVERT(nvarchar(10),tl.startTime,126)='2012-01-19'
AND CONVERT(nvarchar(10),tm.mDatetime,126)='2012-01-19'
AND CONVERT(nvarchar(10),tm.mDatetime,114) >= Convert(nvarchar(10),tl.startTime,114)
AND CONVERT(nvarchar(10),tm.mDatetime,114) <= Convert(nvarchar(10),tl.endTime,114)
AND CONVERT(datetime,(CONVERT(nvarchar(10),tm.mDatetime,114)),114) BETWEEN '06:30:00' and '12:30:00'
 
 
 ข้อมูลตารางที่ใช้ มี 3 ตาราง คือ
 tableMoney
 
 tMoney |	mDatetime(datetime)100.00 |	2012-01-19 07:05:43.546
 200.00 |	2012-01-19 08:32:53.138
 60.00 |	2012-01-19 09:55:21.751
 40.00 |	2012-01-19 10:49:59.947
 50.00 |	2012-01-19 11:19:61.847
 
 tableLogin
 
 usrID |	startTime(datetime) |	endTime(datetime)	00001 |	2012-01-19 07:00:12.329 |	2012-01-19 09:59:55.284
 00002 |	2012-01-19 10:05:12.376 |	2012-01-19 12:45:26.142
 
 tableID
 usrID |	nameID
 00001 |	Test01
 00002 |	Test02
 
 ที่ query ข้อมูลออกมาได้ตอนนี้ คือ
 
 เวลา |				                                           เงิน |	รหัส	| ชื่อ2012-01-19 07:05:43.546 |		100.00 |	00001 |	Test01
 2012-01-19 07:05:43.546 |		100.00 |	00002 |	Test02
 2012-01-19 08:32:53.138 |		200.00 |	00001 |	Test01
 2012-01-19 09:55:21.751 |		60.00 |	00001 | 	Test01
 2012-01-19 09:55:21.751 |		60.00 |	00002 | 	Test02
 2012-01-19 10:49:59.947 |		40.00 |	00001 |	Test01
 2012-01-19 10:49:59.947 |		40.00 |	00002 |	Test02
 2012-01-19 11:19:61.847 |		50.00 |	00002 |	Test02
 
 
 ผลลัพธ์ที่อยากได้จริงๆคือ
 
 เวลา |				เงิน |	รหัส |	ชื่อ2012-01-19 07:05:43.546 |		100.00 |	00001 | 	Test01
 2012-01-19 08:32:53.138 |		200.00 |	00001 |	Test01
 2012-01-19 09:55:21.751 |		60.00 |	00001 |	Test01
 2012-01-19 10:49:59.947 |		40.00 |	00002 |	Test02
 2012-01-19 11:19:61.847 |		50.00 |	00002 |	Test02
 
 และอยากให้เวลา แสดงได้แค่ 2012-01-19 07:05:43 พอ ต้องเขียนยังไงค่ะ ได้แต่แบบ 07:05:43 อย่างเดียว
 
 
 รบกวนผู้รู้ช่วยดูให้ทีนะค่ะ ขอบคุณล่วงหน้ามากๆๆค่ะ
 
 
 
 Tag : .NET, Ms SQL Server 2005, Ms SQL Server 2008, Ms SQL Server 2012, Web (ASP.NET), VS 2010 (.NET 4.x)
 
 
 |  
            |  |  
            | 
              
                |  |  |  |  
                |  | 
                    
                      | Date :
                          2012-07-27 09:27:55 | By :
                          porn_toon | View :
                          1585 | Reply :
                          8 |  |  |  
                |  |  |  |  |  
            |  |  
		            |  |  
		|  |  |  |  |  
  
    | 
 
        
          |  |  |  |  |  
          |  |  | 
            
              | tableMoney ควรจะ column usrID ด้วยมิใช่หรือ 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2012-07-27 09:41:39 | By :
                            watcharop |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ไม่มี usrID ในตาราง Money ให้อ่าคะ 
 เลยต้องใช้วิธี join กัน งงไปหมดเลย T_T
 
 |  
              | 
 ประวัติการแก้ไข
 2012-07-27 10:11:23
 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2012-07-27 10:10:51 | By :
                            porn_toon |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | งงตรง nverchar(10) 
 ใช้เงื่อนไขเป็น datetime ทำไมไม่ convert เป็น datetime หรือ smalldatetime ล่ะ
 
 ใช้ string มันได้ไม่ได้ความหมายเหมือน datetime หรอก
 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2012-07-27 10:31:02 | By :
                            อิอิ |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ลองแปลงเป็น datetime หรือ smalldatetime แล้ว ข้อมูลออกมาไม่ครบตามเงื่อนไขในระยะเวลานั้นๆอะคะ 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2012-07-27 10:58:19 | By :
                            porn_toon |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | สามารถเป็น query ให้ออกมาเหมือนที่ จขกท ต้องการนะ 
 แต่ว่าถ้าจะใช้งานจริงๆ การเก็บข้อมูลเช่นนี้ไม่พอดีจะทำงานหรอก
 
 เช่นในกรณี user1 กับ user2 เข้ามาใช้งานในเวลาใกล้ๆ กัน
 
 เราจะรู้ได้ไงว่า user ไหน เป็นผู้ทำ tablemoney เรคคอร์ดนั้น
 
 แต่ก็ยังยืนยันว่า datetime ดีกว่า string นะ
 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2012-07-27 11:29:10 | By :
                            อิอิ |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | งั้น รบกวน ช่วยแก้ไข Code ให้หน่อยได้ไหมค่ะ งงมากก รบกวนด้วยย 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2012-07-27 12:07:29 | By :
                            porn_toon |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | รบกวนคนใจดีแปลงจาก linq เป็น sql command ทีครับ 
 
  
 Code (C#)
 
         private void buttonRun_Click(object sender, EventArgs e)
        {
            DataTable DtMoney = GetTableMoney();
            DataTable DtLogin = GetTableLogin();
            DataTable DtId = GetTableID();
            var data = from m in DtMoney.AsEnumerable()
                       select new 
                       {
                           mDatetime = m.Field<DateTime>("mDatetime"),
                           tMoney = m.Field<double>("tMoney"),
                           usrID = (from l in DtLogin.AsEnumerable()
                                    where l.Field<DateTime>("startTime") <= m.Field<DateTime>("mDatetime") && l.Field<DateTime>("endTime") >= m.Field<DateTime>("mDatetime")
                                    select l.Field<string>("usrID")).First(),
                           nameID = (from l in DtLogin.AsEnumerable()
                                     join i in DtId.AsEnumerable() on l.Field<string>("usrID") equals i.Field<string>("usrID")
                                     where l.Field<DateTime>("startTime") <= m.Field<DateTime>("mDatetime") && l.Field<DateTime>("endTime") >= m.Field<DateTime>("mDatetime")
                                     select i.Field<string>("nameID")).First()
                       };
            dataGridView1.DataSource = data.ToList();
        }
        private DataTable GetTableMoney()
        {
            string[][] data = new string[][]
            {
                new string[] { "100.00", "2012-01-19 07:05:43.546" },
                new string[] { "200.00", "2012-01-19 08:32:53.138" },
                new string[] { "60.00", "2012-01-19 09:55:21.751" },
                new string[] { "40.00", "2012-01-19 10:49:59.947" },
                new string[] { "50.00", "2012-01-19 11:19:61.847" }
            };
            DataTable DtData = new DataTable();
            DtData.Columns.Add(new DataColumn("tMoney", typeof(double)));
            DtData.Columns.Add(new DataColumn("mDatetime", typeof(DateTime)));
            foreach (string[] aData in data)
            {
                string[] _date = aData[1].Split(("- :.").ToCharArray());
                DateTime date = new DateTime(Convert.ToInt32(_date[0]), Convert.ToInt32(_date[1]), Convert.ToInt32(_date[2]));
                DataRow DrNew = DtData.NewRow();
                DrNew["tMoney"] = Convert.ToDouble(aData[0]);
                DrNew["mDatetime"] = date.AddHours(Convert.ToInt32(_date[3])).AddMinutes(Convert.ToInt32(_date[4])).AddSeconds(Convert.ToInt32(_date[5])).AddMilliseconds(Convert.ToInt32(_date[6]));
                DtData.Rows.Add(DrNew);
            }
            return DtData;
        }
        private DataTable GetTableLogin()
        {
            string[][] data = new string[][]
            {
                new string[] { "00001", "2012-01-19 07:00:12.329", "2012-01-19 09:59:55.284" },
                new string[] { "00002", "2012-01-19 10:05:12.376", "2012-01-19 12:45:26.142" }
            };
            DataTable DtData = new DataTable();
            DtData.Columns.Add(new DataColumn("usrID", typeof(string)));
            DtData.Columns.Add(new DataColumn("startTime", typeof(DateTime)));
            DtData.Columns.Add(new DataColumn("endTime", typeof(DateTime)));
            foreach (string[] aData in data)
            {
                string[] _dateStart = aData[1].Split(("- :.").ToCharArray());
                DateTime dateStart = new DateTime(Convert.ToInt32(_dateStart[0]), Convert.ToInt32(_dateStart[1]), Convert.ToInt32(_dateStart[2]));
                string[] _dateEnd = aData[2].Split(("- :.").ToCharArray());
                DateTime dateEnd = new DateTime(Convert.ToInt32(_dateEnd[0]), Convert.ToInt32(_dateEnd[1]), Convert.ToInt32(_dateEnd[2])); 
                
                DataRow DrNew = DtData.NewRow();
                DrNew["usrID"] = aData[0];
                DrNew["startTime"] = dateStart.AddHours(Convert.ToInt32(_dateStart[3])).AddMinutes(Convert.ToInt32(_dateStart[4])).AddSeconds(Convert.ToInt32(_dateStart[5])).AddMilliseconds(Convert.ToInt32(_dateStart[6]));
                DrNew["endTime"] = dateEnd.AddHours(Convert.ToInt32(_dateEnd[3])).AddMinutes(Convert.ToInt32(_dateEnd[4])).AddSeconds(Convert.ToInt32(_dateEnd[5])).AddMilliseconds(Convert.ToInt32(_dateEnd[6]));
                DtData.Rows.Add(DrNew);
            }
            return DtData;
        }
        private DataTable GetTableID()
        {
            string[][] data = new string[][]
            {
                new string[] { "00001", "Test01" },
                new string[] { "00002", "Test02" }
            };
            DataTable DtData = new DataTable();
            DtData.Columns.Add(new DataColumn("usrID", typeof(string)));
            DtData.Columns.Add(new DataColumn("nameID", typeof(string)));
            foreach (string[] aData in data)
            {
                DataRow DrNew = DtData.NewRow();
                DrNew["usrID"] = aData[0];
                DrNew["nameID"] = aData[1];
                DtData.Rows.Add(DrNew);
            }
            return DtData;
        }
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2012-07-27 15:25:48 | By :
                            อิอิ |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | SELECT DISTINCT tm.mDatetime as ‘เวลา’,tm.tMoney as ‘เงิน’,tl.usrID as ‘รหัส’,tid.nameID as ‘ชื่อ’ From tableMoney tm inner join tableLogin tl on CONVERT(nvarchar(10),tm.mDatetime,126)=CONVERT(nvarchar(10),tl.startTime,126)
 LEFT JOIN tableID tid on tid.caUser_ID=tl.usrID
 WHERE CONVERT(nvarchar(10),tl.startTime,126)='2012-01-19'
 AND CONVERT(nvarchar(10),tm.mDatetime,126)='2012-01-19'
 AND CONVERT(nvarchar(10),tm.mDatetime,114) >= Convert(nvarchar(10),tl.startTime,114)
 AND CONVERT(nvarchar(10),tm.mDatetime,114) <= Convert(nvarchar(10),tl.endTime,114)
 AND CONVERT(datetime,(CONVERT(nvarchar(10),tm.mDatetime,114)),114) BETWEEN '06:30:00' and '12:30:00'
 
 ลองดูนะครับ
 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2012-07-31 03:31:26 | By :
                            eazycorner |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  |  |