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 > ขอคำปรึกษาเรื่องการ Join ตาราง table หน่อยครับ ภาษา sql



 

ขอคำปรึกษาเรื่องการ Join ตาราง table หน่อยครับ ภาษา sql

 



Topic : 088836



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



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




ผมมีตารางที่สัมพันธ์กันอยู่ แล้วผมก็เขียนโค้ด join ตารางออกมาตามรูปข้างล่าง

joinตาราง

โค้ด join ตาราง
Code (C#)
var rhh = from rh in IResearch
    join c in ICheckStatus on rh.ID_Research equals c.ID_Research into JoinedEmpDept1
    from c in JoinedEmpDept1.DefaultIfEmpty()
    join s in IStatusTasks on c.ID_StatusTask equals s.ID_StatusTask into JoinedEmpDept
    from s in JoinedEmpDept.DefaultIfEmpty()
       select new 
       {
         ResearchNo = rh.ResearchNo, //รหัสโครงการ
         ResearchN = rh.ResearchN, //ชื่องานวิจัย
         Yearbudget = rh.Yearbudget, //ปี
         StastusTask = s.StatusTask1, //สถานะ
       };
GridView3.DataSource = rhh.ToList();
GridView3.DataBind();


แต่ที่นี้รูปแบบที่ออกมาแบบนี้ถ้าเวลาออกเป็นรายงาน มันอ่านยาก งงแน่ๆ มันมีหลายแถวเกิน

ผมต้องเขียนคำสั่ง Join แบบไหน ครับ เพื่อรวมกลุ่มข้อมูล ผมไม่ต้องการให้มันมีหลายแถว อยากให้สถานะรวมกันเป็นฟิลด์เดียว

ออกรายงาน



Tag : .NET, Web (ASP.NET), LINQ, C#









ประวัติการแก้ไข
2013-01-06 09:21:00
2013-01-06 09:21:30
2013-01-06 09:22:07
2013-01-06 10:36:34
2013-01-09 20:11:14
2013-01-09 20:12:28
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2013-01-06 08:46:40 By : ERO-TIC View : 1798 Reply : 10
 

 

No. 1



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



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

ใน crytal report มีคำสั่ง suppress If Duplicated ครับ






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-01-07 11:04:06 By : tee
 


 

No. 2



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



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


ไม่ได้ครับ ผมอาจจะสื่อสารผิด คือ ผมอยากได้รูปแบบคล้ายกระทู้นี้อ่ะครับ
https://www.thaicreate.com/dotnet/forum/088868.html

อยากได้เป็น งานวิจัยหนึ่งให้แสดงแค่หนึ่งแถว แต่เพราะมันมีหลายสถานะ มันเลยแสดงออกมาหลายแถว

ผมอยากให้มันมี , ลูกน้ำ คั่น ตรงสถานะ แล้วเก็บสถานะไว้ในฟิลด์เดียวกัน
เช่น
5501 การพัฒนาฐานข้อมูลLINQ 2555 เบิกจ่ายงวดที่1,เบิกจ่ายงวดที่2,เบิกจ่ายงวดที่3,

ประมาณนี้ ต้องทำยังไงครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-01-09 20:10:38 By : ERO-TIC
 

 

No. 3



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



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

ลองทำ ตามนี้ดูครับ
นำ ตารางที่ join กัน ไว้ ไปทำเป็น views ครับ โดยใน views นี้ให้ select case ฟิวด์ status เพิ่มมาอีก1 ฟิวด์

ตัวอย่าง คำสั่ง views : Vw_Research
Code (SQL)
SELECT     TOP (100) PERCENT id, name, years, status, 
                      (CASE WHEN [status] = 'เบิกจ่ายงวดที่ 1' THEN 1 WHEN [status] = 'เบิกจ่ายงวดที่ 2' THEN 2 WHEN [status] = 'เบิกจ่ายงวดที่ 3' THEN 3 WHEN [status] = 'ส่งร่างรายงานฉบับ สมบูรณ์'
                       THEN 4 WHEN [status] = 'ส่งรายงานฉบับ สมบูรณ์' THEN 5 WHEN [status] = 'เสร็จแล้ว' THEN 6 ELSE 0 END) AS statusnumber
FROM         dbo.Research
GROUP BY id, name, years, status
ORDER BY years DESC


รูปภาพ views
vw_research


เมื่อสร้าง views เสร็จแล้ว ให้เขียนคำสั่ง sql ดังนี้ครับ
Code (SQL)
SELECT     TOP (100) PERCENT id, name,
					 case when( sum(CASE WHEN [statusnumber] = 1 THEN 1 ELSE 0 END)) =1 then 'บิกจ่ายงวดที่ 1' else '' end AS status1, 
                     case when( sum(CASE WHEN [statusnumber] = 2 THEN 2 ELSE 0 END)) =2 then 'บิกจ่ายงวดที่ 2' else '' end AS status2, 
                     case when( sum(CASE WHEN [statusnumber] = 3 THEN 3 ELSE 0 END)) =3 then 'เบิกจ่ายงวดที่ 3' else '' end AS status3,
                     case when( sum(CASE WHEN [statusnumber] = 4 THEN 4 ELSE 0 END)) =4 then 'ส่งร่างรายงานฉบับ สมบูรณ์' else '' end  AS status4, 
                     case when( sum(CASE WHEN [statusnumber] = 5 THEN 5 ELSE 0 END)) =5 then 'ส่งรายงานฉบับ สมบูรณ์' else '' end  AS status5, 
                     case when( sum(CASE WHEN [statusnumber] = 6 THEN 6 ELSE 0 END)) =6 then 'เสร็จแล้ว' else '' end AS status6
FROM         VW_Research
group by id,name,years
ORDER BY years DESC


จะได้ข้อมูลตามภาพ
results
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-01-10 12:43:08 By : tee
 


 

No. 4



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



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


ขอบคุณมากๆ เลยครับ ผมทำตามที่คุณแนะนำได้แล้วครับ

ผมเขียนโค้ดแบบนี้ครับ แล้วเจอปัญหาใหม่ครับพอเพิ่มฟิลด์วันที่เข้ามาด้วย
Code (SQL)
SELECT TOP 100 PERCENT [ResearchNo],[ResearchN],[Yearbudget],[CheckStatusDate],
	case when( sum(CASE WHEN [ID_StatusTask] = 1 THEN 1 ELSE 0 END)) =1 then 'เบิกจ่ายงวดที่ 1' else '' end AS status1, 
    case when( sum(CASE WHEN [ID_StatusTask] = 2 THEN 2 ELSE 0 END)) =2 then 'เบิกจ่ายงวดที่ 2' else '' end AS status2, 
    case when( sum(CASE WHEN [ID_StatusTask] = 3 THEN 3 ELSE 0 END)) =3 then 'เบิกจ่ายงวดที่ 3' else '' end AS status3,
    case when( sum(CASE WHEN [ID_StatusTask] = 4 THEN 4 ELSE 0 END)) =4 then 'ส่งร่างรายงานฉบับสมบูรณ์' else '' end  AS status4, 
    case when( sum(CASE WHEN [ID_StatusTask] = 5 THEN 5 ELSE 0 END)) =5 then 'ส่งรายงานฉบับสมบูรณ์' else '' end  AS status5, 
    case when( sum(CASE WHEN [ID_StatusTask] = 6 THEN 6 ELSE 0 END)) =6 then 'สำเร็จแล้ว' else '' end AS status6       
  FROM [Irdbase].[dbo].[View_1]
  GROUP BY ResearchNo, ResearchN, Yearbudget, CheckStatusDate
  ORDER BY Yearbudget DESC


ซึ่งพอเพิ่มฟิลด์วันที่เข้ามามันก็แสดงหลายแถวเหมือนเดิม
ซึ่งวันที่มันมีหลายวันที่ ไม่ตายตัวเหมือนสถานะ จะเช็คค่ายังไงครับ

queyview

รูปแบบที่ต้องการให้แสดงเป็นแถวเดียวเหมือนเดิมครับ

ResearchNo ResearchN Yearbudget status1 status2 status3 ... วันที่สถานะ 1 วันที่สถานะ 2 วันที่สถานะ 3
5501 การพัฒนาฐานข้อมูลLINQ 2555 เบิกจ่ายงวดที่1,เบิกจ่ายงวดที่2,เบิกจ่ายงวดที่3,... 2012-10-25 2012-11-25 2012-12-25

รบกวนช่วยแนะนำด้วยนะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-01-11 21:25:24 By : ERO-TIC
 


 

No. 5



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

สมาชิกที่ใส่เสื้อไทยครีเอท

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

ถ้ายังอยากใช้ linq เหมือนเดิม
Code (C#)
            var rhh = new [] {
                new {ResearchNo = "5502",ResearchN="ประมวลผลตัวเลข"
                    ,Yearbudget ="2555",StastusTask="เบิกจ่ายงวด 1"},
                new {ResearchNo = "5501",ResearchN="การพัฒนา LINQ"
                    ,Yearbudget ="2555",StastusTask="เบิกจ่ายงวด 1"},
                new {ResearchNo = "5502",ResearchN="ประมวลผลตัวเลข"
                    ,Yearbudget ="2555",StastusTask="เบิกจ่ายงวด 2"},
                new {ResearchNo = "5401",ResearchN="ระบบคำนวณ"
                    ,Yearbudget ="2554",StastusTask="เบิกจ่ายงวด 1"},
                new {ResearchNo = "5501",ResearchN="การพัฒนา LINQ"
                    ,Yearbudget ="2555",StastusTask="สำเร็จแล้ว"},
                new {ResearchNo = "5401",ResearchN="ระบบคำนวณ"
                    ,Yearbudget ="2554",StastusTask="เบิกจ่ายงวด 2"},
                new {ResearchNo = "5501",ResearchN="การพัฒนา LINQ"
                    ,Yearbudget ="2555",StastusTask="เบิกจ่ายงวด 3"}
            };

            var rhh2 = from rhhItem in rhh
                       group rhhItem by new {
                           rhhItem.ResearchNo,
                           rhhItem.ResearchN,
                           rhhItem.Yearbudget
                       } into r
                       select new {
                           ResearchNo = r.Key.ResearchNo,
                           ResearchN = r.Key.ResearchN,
                           Yearbudget = r.Key.Yearbudget,
                           StastusTask = ( from rItem in r select rItem.StastusTask)
                            .Aggregate((c,n)=> c + " , " + n)
                       };
            GridView3.DataSource = rhh2.ToList();
            /*  
                ทดลองเปลี่ยนเป็น rhh.ToList() แล้วลองสังเกตุความเปลี่ยนแปลง
                ส่วนฟิล CheckStatusDate นี่ก็ไม่น่ายาก ลองเอาไปดัดแปลงดูครับ             
             */ 

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-01-12 21:31:54 By : SandKing
 


 

No. 6



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



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


ขอบคุณครับ แต่แบบนี้คือประกาศค่าไว้ในอารเรย์

แต่ถ้าผมต้องการดึงมาจากฐานข้อมูลเลยล่ะครับ ผมทำไม่ได้
ต้องการถึงจากฐานข้อมูลเลยครับ เพราะงานมันมีเพิ่มมาเรื่อยๆครับ

Code (C#)
 var rhh = from v in db.View_1s    //ดึงมาจาก View ที่สร้างไว้
                            select new
                            {
                                ResearchNo = v.ResearchNo,
                                ResearchN = v.ResearchN,
                                Yearbudget = v.Yearbudget,
                                StastusTask = v.StatusTask
                            };
            var rhh2 = from rhhItem in rhh
                       group rhhItem by new
                       {
                           rhhItem.ResearchNo,
                           rhhItem.ResearchN,
                           rhhItem.Yearbudget
                       } into r
                       select new
                       {
                           ResearchNo = r.Key.ResearchNo,
                           ResearchN = r.Key.ResearchN,
                           Yearbudget = r.Key.Yearbudget,
                           StastusTask = (from rItem in r select rItem.StastusTask)
                            .Aggregate((c, n) => c + " , " + n)
                       };
            GridView3.DataSource = rhh2.ToList();
            GridView3.DataBind();

//รันแล้วมัน error ว่า The query operator 'Aggregate' is not supported.

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-01-14 08:51:55 By : ERO-TIC
 


 

No. 7



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

สมาชิกที่ใส่เสื้อไทยครีเอท

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

งั้นลองใช้แบบนี้ดูครับ
Code (C#)
StastusTask = string.Join(",",( from rItem in r select rItem.StastusTask ).ToArray())


ปล.ที่ต้องใช้ array เพราะผมไม่รู้ว่าดาต้าเบสของคุณก่อนการ join มันเก็บข้อมูลอะไรบ้าง เลยให้ rhh เป็น array แทน
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-01-14 12:39:20 By : SandKing
 


 

No. 8



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



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


StastusTask = string.Join(",",( from rItem in r select rItem.StastusTask ).ToArray()) แบบนี้ใช้ครับ

ขอบคุณครับมากๆครับ
ทั้ง คุณ tee, คุณ Programmer Of Persia เก่งจังเลยครับ

ตอนแรกผมว่าจะใช้ Linq ครับ
แต่เพราะมันต้องส่งเข้า DataTable ผมเลยต้องเขียนเป็น SQL
คือผมจะออกรายงานเป็น Excel ผมดูตัวอย่างมาจากเว็บนี้
http://www.gemboxsoftware.com/spreadsheet/features/samples/asp-net-webdemo
http://www.gemboxsoftware.com/spreadsheet/features/samples/asp-net-webdemo-cs

แล้วของคุณ Tee ที่ทำให้ผมก็คล้ายกับรูปแบบรายงานที่ผมต้องการ
ถ้ามีอะไรจะแนะนำเชิญได้เลยครับ
ผมได้ความรู้เยอะเลยครับ ผมต้องศึกษาอีกมากครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-01-15 19:33:29 By : ERO-TIC
 


 

No. 9



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



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


ผมขอถามเพิ่มหน่อยนะครับ เกี่ยวกับ Dataset Datatable Linq

ตัวอย่างโค้ด Excel ที่ผมใช้อยู่
Code (C#)
protected void Button1_Click(object sender, EventArgs e)
 {
string StrConn = WebConfigurationManager.ConnectionStrings["IrdbaseConnectionString"].ConnectionString;
            SqlConnection Conn = new SqlConnection(StrConn);
            Conn.Open();

            string sqlCustommer = "SELECT ID_Researcher, PrefixName, ResearcherN, IDcard FROM Researcher"; 
//ผมอยากทราบว่าเราสามารถเขียนคิวรี ด้วย Linq ได้ไหมครับ แล้วยัดใส่ Datatable อีกที
            SqlDataAdapter da = new SqlDataAdapter(sqlCustommer, Conn); 
            DataTable people = new DataTable(); // Datatable
            da.Fill(people);

            // Create excel file.
            ExcelFile ef = new ExcelFile();
            ExcelWorksheet ws = ef.Worksheets.Add("DataSheet");
            ws.InsertDataTable(people, "A1", true); //people บังคับต้องใช้  Datatable
            // Stream file to browser
            ef.SaveToHttpResponse(this.Response, "Report." + DateTime.Now.ToString() + ".xlsx");
}


ตัวทีผมใช้มันบังคับให้ใช้ Datatable ผมเลยอยากรู้ว่ามันใช้ร่วมกันได้ไหมครับระหว่าง Datatable กับ Linq ต้องทำยังไง
หรือมีวิธีอื่นที่ออกไฟล์ Excel .xlsx ได้และรองรับภาษาไทย


ประวัติการแก้ไข
2013-01-16 20:23:43
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-01-16 20:22:53 By : ERO-TIC
 


 

No. 10



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

สมาชิกที่ใส่เสื้อไทยครีเอท

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

เปลี่ยน linq เป็น datatable
http://stackoverflow.com/questions/4460654/best-practice-convert-linq-query-result-to-a-datatable-without-looping

ของ gembox นี่ ฟรีเหรอครับ ???

ถ้าไม่อยากออก excel ยุ่งยากก็ใช้ไส้ในเป็น html ครับ
Code (XML)
<table border=1>
	<tr>
		<td>Header1</td>
		<td>Header2</td>
	</tr>
	<tr>
		<td>ข้อมูล 2</td>
		<td>ข้อมูล 3</td>
	</tr>
	<tr>
		<td>ข้อมูล 4</td>
		<td>ข้อมูล 5</td>
	</tr>
	<tr>
		<td>ข้อมูล 6</td>
		<td>ข้อมูล 7</td>
	</tr>
</table>

ลองก็อบโค้ดข้างบนลง notepad แล้ว save เป็น abc.xls ดูครับ

อีกวิธีนึง advance มาอีกนิด คือใช้ ExcelLibraly
http://code.google.com/p/excellibrary/
ตัวนี้ดีตรงมันฟรีครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-01-19 12:01:45 By : SandKing
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : ขอคำปรึกษาเรื่องการ Join ตาราง table หน่อยครับ ภาษา sql
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ 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 00
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 อัตราราคา คลิกที่นี่