BMS-HOSxP Community

HOSxP => การเขียน SQL Script => ข้อความที่เริ่มโดย: perjer4675 ที่ ธันวาคม 12, 2007, 12:05:28 PM

หัวข้อ: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: perjer4675 ที่ ธันวาคม 12, 2007, 12:05:28 PM
 ;D ;D MySql วันละคำ กับ perjer  ;D ;D

ของผมจะเป็นการสอนการใช้แต่ถ้านำไปใช้จิรงก็ประยุกเอานะครับ และไม่ต้องแปลกใจกับ as dd นะครับ ผมแค่เอาค่าที่ได้ไปเก็บในตัวแปล dd เท่านั้นครับ หากมีผิดพลาดประการใดก็แนะนำด้วยครับ

อ้างอิงจาก http://dev.mysql.com/doc/ ครับส่นใจเข้าไปโหลดอ่านได้ครับ

// Mysql 5.0 ขึ้นไปนะครับ เพราะส่วนใหญ่ใช้ version 5 กันนะครับ ส่วนที่ตำกว่านี้ก็สามารถถามมาได้ครับ แล้วผมจะตอบให้ครับ

คำสั่ง if เงื่อนไข ครับ

          select if ("a"="a",1,2) as dd ผลที่ได้ก็คือ 1 ครับ เพราะ a มันเท่ากับ a ก็จะเอา 1 มาแสดงครับ
          select if ("a"="b",1,2) as dd ผลที่ได้ก็คือ 2 ครับ เพราะ a มันไม่เท่ากับ b ก็จะเอา 2 มาแสดงครับ

คำสั่ง substring การตัดตัวอักษร  ครับ

          select substring("123456789",1,5) as dd ค่าที่ได้คือ 12345 เพราะการผมตัดโดยกำหนดตำแหน่งที่ 1 ถึง 5 ครับ
     
         substring_index("1234516789","1",2) as dd ค่าที่ได้ก็คือ 123451 เป็นการตัดโดยใช้การหาตำแหน่งตัวอักษรครับ จากคำสั่งนี้หมายถึง เอาตัวอักษรตังแต่เริ่มจนถึง 1 ตัวที่ จะเห็นว่ามีเลขหนึ่งสองตัวแต่
         substring_index("1234516789","1",-1) as dd ค่าที่ได้คือ 16789 ครับต่างกันที่จุดเริ่มต้นอยู่ด้วยขวาครับ

คำสั่ง  UPPER ทำตัวพิมพ์เล็กเป็นตัวพิมพ์ใหญ่         
         SELECT UPPER("perjerไทย") as dd จะได้เป็น PERJERไทย ครับภาษาไทยไม่เปลี่ยนอะครับไม่ต้องกลัว

คำสั่ง REPLACE แทนที่ตัวอักษรด้วยค่าที่ต้องการครับ

         SELECT REPLACE("123456789", "56", "M") as dd ค่าที่ได้คือ 1234M789 ครับ เพราะผมแทนที่ 56 ด้วย M ครับ

คำสั่ง TIMESTAMPDIFF หาค่าความต่างของ เดือน กะ ปี ครับ  
         
         SELECT TIMESTAMPDIFF(MONTH,"2003-02-01","2003-05-01") as dd ค่าที่ได้คือ 3 ครับเพราะเดือน ห่างกัน 3 ครับ
         
         SELECT TIMESTAMPDIFF(YEAR,"2001-01-01","2002-01-01") as dd ค่าที่ได้คือ 1 ครับ เพราะห่างกันหนึ่งปี

         SELECT TIMESTAMPDIFF(day,"2001-01-01","2002-01-01") as dd ค่าที่ได้คือ  365 เพราะต่างกัน 1 เท่ากับ 365 วันไงละครับ

         แตแค่นี้หลายคนก็คงยังมีคำถามในใจอีกว่าแล้วจะหาได้ วัน ที่ย้อนหลัง จากวันที่เรากำหนดได้เปล่า เช่น จะหาย้อนไป 28 วันของวันที่ 1/12/2550 ว่าเป็นวันที่เท่าไหรอะครับ นี้เลยครับคำสั่ง
         
         SELECT FROM_DAYS(TO_DAYS("2007-12-01")-28) as dd ค่าที่ได้คือ 3/11/2550 นี่คือคำตอบ อิอิ

หรือ วันใช้ SELECT SUBDATE('1998-01-02', INTERVAL 28 day) as dd ผลที่ได้ก็คือ 2007-11-03 มีค่าเท่ากัน อิอิฃ
       เดือนใช้ SELECT SUBDATE("2007-12-01", INTERVAL 1 MONTH) as dd ผลที่ได้คือ 2007-11-01
       ถ้าปีก็ SELECT SUBDATE("2007-12-01", INTERVAL 1 year) as dd ผลที่ได้คือ 2006-12-01 แค่นี้ครับ


 ;D ;D การใช้งาน Report Designer ครับ  ;D ;D

 หัวข้อแรกขอกล่าวถึง Variable ก่อนเลยครับ

เราสามารถเขียนคำสั่งและใช้ function ต่างๆได้เหมือนกันครับ เริ่มกันเลย นะครับ

1. เราสามารถปิดการแสดงของ  Lable , Dbtext   และตัวอื่นๆ รวมทั้งตัวมันเองด้วยครับ ตัวอย่างเช่น
     หากมี Dbtext ที่มีค่าของ รหัสบัตรประจำตัวประชาชน ที่นี้ผมต้องการ ที่จะปิดตัว DbText กับ Lable ถ้าเลขบัตรเท่ากับ 1-1111-11111-11-1
ผมก็เขียนใน Varialeble ตัวหนึ่งดังนี้ ครับ
   if (DBPipeline['mon'] = '1-1111-11111-11-1') then
   begin
      DbText1.visible := false;
      Lable1.visible := false;
   end else
   begin
      DbText1.visible := true;
      Lable1.visible := true;
   end;
หลักการก็ง่ายนิดเดียวครับ ชื่อของตัวที่เราต้องการปิด แล้วก็ .visible := จริง หรือ เท็จ

2. เราสามารถเอาค่าในตัวต่างๆ ออกมาบวกกันใน Variable เช่น ผมจะเขียน code ใน variable1 โดยเอาค่าจาก variable2 กับ variable3  มาบวกกัน แล้วแสดงใน variable1
   ผมก็เข้าไปเขียนใน variable1 ดังนี้ครับ
   value := variable2.value + variable3.value;
   เป็นอันเสร็จสิ้นครับ
อีกอย่างที่อยากบอกวิธีใช้มันนั่นคือ memo ครับ หลายคนอาจอยากรู้ว่าใช้ยังไง เราก็สามารถเขียนใน variable ตัวหนึ่งเพื่อให้ค่าไปออกใน memo
   เช่นผมเขียนใน variable1 ว่า
   memo1.text := '12345678'; นี่คือวิธีการเอาค่าใส่ลงใน memo ง่ายไหมครับ

// 14/12/2550
             
ในการใช้ concat หากมี ฟิลด์ ไหนเกิดเป็นค่า Null ก็จะไม่มีค่าอะไรเกิดขึ้นเลย เช่น  

SELECT CONCAT('My', NULL, 'QL')  ผลที่ได้คือ null ไม่มีอะไรออกมาครับ ดังนั้นวิธิแก้ครับผมยกตัวอย่าง patient ในการรวมชื่อนะครับ
select concat(if(pname is null,'',pname),if(fname is null,'',fname),if(lname is null,'',lname)) as full_name from patient

แค่นี้อะครับก็ OK วันนี้แค่นี้ก่อนนะครับ



   


  ใน Report Designer จจะมี function ที่ชือว่า GetPickupList(); หลายคนอาจเคยใช้ แต่หลายคนก็ยังใช้ไม่ค่อยเป็นวันนี้ วิธีใช้มาฝากครับ

ผมประกาศ ตัวแปลตัวหนึ่งขึ้นชื่อว่า pttype เป็น string ครับ จากนั้นก็เริ่มกันเลยครับ

ผมเขียนในส่วนของ Events นะครับ

pttype := GetPickupList('select "ALL" as name union select name from pttype '); // อาจจะมีคำถามถามว่า แล้ว Union นี้คืออะไร มันก็คือการเอา คำว่า ALL ไปรวมอยู่กับการเลือกสิทธิไงครับ ต่อเลยนะครับ

จากนั้นก็ต่อด้วย

if (pttype='') or (pttype='ALL') then
    begin
       pttype := '';
    end else
    begin
       pttype :=  GetSQLStringData('select pttype from pttype where name="'+pttype+'" ');
       pttype := ' pttype="'+pttype+'"';
    end;

เป็นการเทียบค่าที่ เลือกจาก function ข้างบนครับว่าเข้าเลือก ALL หรือค่าว่าง (คือไม่ได้เลือกนั่นเอง) ถ้าเลือกALL หรือค่าว่าง (คือไม่ได้เลือกนั่นเอง) pttype เท่ากับค่าว่าง แต่ถ้าเลือกสิทธิอื่นก็จะมาทำข้างล้างครับ

ตัวอย่างบรรทัด pttype := ' pttype="'+pttype+'"'; จะได้ pttype มีค่าเท่ากับ ' pttype="เลขสิทธิที่เลือก" ครับ

จากนั้นก็ใช้นี่เลยครับ function ChangeReportSQL(); //

ChangeReportSQL('select * from vn_stat '+
    '  where  '+pttype+' '+
    '    group by vn order by vstdate ');

แค่นี้เราก็จะได้รายงานที่สามารถเลือกสิทธิของผู้ป่วยได้แล้วครับว่าจะดูผู้ป่วยทุกสิทธิ หรือ เฉพาะสิทธิที่เราเลือก อิอิ


ลองดูนะครับไม่ได้ก็ถามมาครับ จะได้เป็น เทพ Admin  
   








 ;D :D ไม่จำเป็นต้องเก่งขอเพียงแค่ขยัน  :D ;D


หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: perjer4675 ที่ ธันวาคม 12, 2007, 13:59:10 PM
 ;D ;D ผมขอใช้ หัวขอนี้เป็นที่รวบรวม คำถาม  คำตอบ และ คำแนะนำ เกียวกับ sql กับการใช้งาน Report Designer ของโปรแกรม HOSxP ครับ ไม่ว่าจะเป็น การใช้ Variable การออกแบบ Report การใช้คำสั่ง Sql และ Delphi เล็กๆน้อยๆ นะครับ ไว้ให้สำหรับผู้ที่ส่นใจ อยาก Up ตัวเองขึ้น ไม่ใช่ด้วยความเก่งแต่เป็นความขยัน  ;D ;D

 ;D ;D สามารถพูด คุยกันได้ครับ ทุกคำถามผมจะพยายามหาคำตอบให้ครับ เพราะถ้าผมยังไม่ได้ทำจะยังไม่บอกว่าทำไม่ได้  ;D ;D
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: nuttavut ที่ ธันวาคม 12, 2007, 15:53:56 PM
ขอบคุณครับ.... ;D ;D จะได้เอาไปประยุกต์ใช้.. :D
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: perjer4675 ที่ ธันวาคม 12, 2007, 20:03:22 PM
 ;D ;D ขอบคุณที่เขามาอ่านครับคุณ nuttavut  ;D ;D

มีอีกอย่างที่อยากบอกเป็นของฝากนักกอร์ฟแล้วกัน
คือ นั่นคือ "" กับ null   (ค่าว่าง กับ null) สองอันนี้ต้องขอบอกว่ามันต่างกันอะครับ อย่างเช่น
 select count(*) from from ovst where doctor = "" อาจจะได้ค่าไม่เท่ากับ
 select count(*) from from ovst where doctor is null นะจะบอกให้


     
 
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: อู๋kokha50 ที่ ธันวาคม 13, 2007, 08:28:41 AM
ขอขอบคุณ คุณPERJER4675 มากๆ ครับที่ ให้โอกาส admin มือใหม่ที่กำลังพึ่งก้าวเข้าสู่วงการ HosXp
จะได้มีพื้นที่ เรียนรู้ด้วยตนเองสำหรับคนที่ขยันและไม่มีโอกาสไปเข้าห้องเรียนอบรม ครับ
ขอสนับสนุนความรู้สาธารณะที่เป็นวิทยาทาน ยิ่งให้ผู้อื่นมากตนก็ยิ่งได้รับความรู้กลับคืนมากด้วย ครับ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: maaeda ที่ ธันวาคม 13, 2007, 08:45:40 AM
ดีใจจัง มีคนเข้าใจมือใหม่   ;D ;D  ต่อไปคงจะมาขอคำปรึกษา คุณ perjer รบกวนตอบข้อสงสัยด้วยครับ  และผู้รู้ท่านอื่น ๆ ด้วย :-* :-* :-*
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: chinaga ที่ ธันวาคม 13, 2007, 08:51:56 AM
ขอบคุณมากครับจะนำไปศึกษาดูครับคงได้สอบถามเพิ่มเติมเยอะเลยครับ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: woravet ที่ ธันวาคม 13, 2007, 12:31:47 PM
น่าจะมีบอกไว้เกี่ยวกับบางคำสั่ง เพราะใช้ต่าง version กัน
เช่น timestampdiff ใช้ใน MySQL 5 ขึ้นไป
เพราะของผมยังใช้ 4 อยู่เลยใช้ไม่ได้
*****
ผมไม่แน่ใจว่า from_days กับ to_days เป็น store procedures รึปล่าว
เห็นมีอยู่หลายตัวเหมือนกันใน HOSxP
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: perjer4675 ที่ ธันวาคม 13, 2007, 14:01:36 PM
น่าจะมีบอกไว้เกี่ยวกับบางคำสั่ง เพราะใช้ต่าง version กัน
เช่น timestampdiff ใช้ใน MySQL 5 ขึ้นไป
เพราะของผมยังใช้ 4 อยู่เลยใช้ไม่ได้
*****
ผมไม่แน่ใจว่า from_days กับ to_days เป็น store procedures รึปล่าว
เห็นมีอยู่หลายตัวเหมือนกันใน HOSxP

ผมต้องขอบอกว่าเป็น Mysql 5.0 ขึ้นไปอะครับ ส่วน 4 ก็สามารถเข้ามาถามได้ครับ

ส่วน from_days กับ to_days ไม่ใช่ store procedures แต่เป็น Function เกียวกับ Date อะครับ

สามารถดูได้ในส่วนของหัวข้อ

12.5. Datums- und Zeitfunktionen

ถ้าภาษาอังกฤษ ก็หัวข้อ 10.6. Date and Time Functions

หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: perjer4675 ที่ ธันวาคม 13, 2007, 18:43:57 PM
 ;D ;D ใน Report Designer จจะมี function ที่ชือว่า GetPickupList(); หลายคนอาจเคยใช้ แต่หลายคนก็ยังใช้ไม่ค่อยเป็นวันนี้ วิธีใช้มาฝากครับ

ผมประกาศ ตัวแปลตัวหนึ่งขึ้นชื่อว่า pttype เป็น string ครับ จากนั้นก็เริ่มกันเลยครับ

ผมเขียนในส่วนของ Events นะครับ

pttype := GetPickupList('select "ALL" as name union select name from pttype '); // อาจจะมีคำถามถามว่า แล้ว Union นี้คืออะไร มันก็คือการเอา คำว่า ALL ไปรวมอยู่กับการเลือกสิทธิไงครับ ต่อเลยนะครับ

จากนั้นก็ต่อด้วย

if (pttype='') or (pttype='ALL') then
    begin
       pttype := '';
    end else
    begin
       pttype :=  GetSQLStringData('select pttype from pttype where name="'+pttype+'" ');
       pttype := ' pttype="'+pttype+'"';
    end;

เป็นการเทียบค่าที่ เลือกจาก function ข้างบนครับว่าเข้าเลือก ALL หรือค่าว่าง (คือไม่ได้เลือกนั่นเอง) ถ้าเลือกALL หรือค่าว่าง (คือไม่ได้เลือกนั่นเอง) pttype เท่ากับค่าว่าง แต่ถ้าเลือกสิทธิอื่นก็จะมาทำข้างล้างครับ

ตัวอย่างบรรทัด pttype := ' pttype="'+pttype+'"'; จะได้ pttype มีค่าเท่ากับ ' pttype="เลขสิทธิที่เลือก" ครับ

จากนั้นก็ใช้นี่เลยครับ function ChangeReportSQL(); //

ChangeReportSQL('select * from vn_stat '+
    '  where  '+pttype+' '+
    '    group by vn order by vstdate ');

แค่นี้เราก็จะได้รายงานที่สามารถเลือกสิทธิของผู้ป่วยได้แล้วครับว่าจะดูผู้ป่วยทุกสิทธิ หรือ เฉพาะสิทธิที่เราเลือก อิอิ


ลองดูนะครับไม่ได้ก็ถามมาครับ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: thannawe ที่ ธันวาคม 13, 2007, 21:40:34 PM
กระทู้นี้เป็นประโยชน์มากมายมหาศาลเลยครับท่าน
ขอขอบพระคุณครับ  ;D
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: doramon ที่ ธันวาคม 13, 2007, 21:40:50 PM
ทำเป็นหนังสือเลย
 ;D
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: perjer4675 ที่ ธันวาคม 14, 2007, 10:39:20 AM
 ;D ;D หนังสือคงไม่อะครับ เพราะอยากให้มาแลกเปลี่ยนความรู้ กันในเว็บครับ  ;D ;D

เพราะจะได้มีความเป็นศูนย์รวมในการ ถามตอบ ที่ทันเวลาทันใจครับ
ส่วนหนังสือหาอ่านก็คงมีทั่วไปอะครับ แต่การเอามาใช่คงต้องอธิบาย
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: nuttavut ที่ ธันวาคม 14, 2007, 11:36:35 AM
ดีครับ...ขอบคุณมากๆ เวลาลืมจะได้มาคนหาได้ที่นี่
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: SrWooD ที่ ธันวาคม 14, 2007, 11:39:50 AM
รบกวนตรวจสอบ sql ให้ด้วยครับ

เอาไว้เช็ค HN ที่ข้ามครับ

โค๊ด: SQL
  1. SET @x='0000000';
  2. SELECT v.xhn,b.hn
  3. FROM (SELECT RIGHT(concat('000000',@x:=@x+1),7) AS xhn FROM patient a) AS v
  4. LEFT OUTER JOIN patient b ON v.xhn=b.hn
  5. HAVING b.hn IS NULL
  6. LIMIT 10
  7.  

ว่าทำไมมันช้าครับ กำหนด limit ที่น้อยก่อนนะครับ ขอบอก แล้วใช้ hn 7 หลักนะครับ

ที่ผมทดสอบในเครื่องทดสอบออกนะครับ ตอนแรกนึกว่าเครื่อง hang ครับ

แล้วจะปรับอย่างไรได้บ้างครับ

รบกวนผู้รู้ทุกท่านด้วยครับ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: Baannork ที่ ธันวาคม 25, 2007, 20:29:57 PM
เทสๆ แหะๆ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: naydekdee ที่ กันยายน 30, 2009, 23:17:53 PM
ขอบคุณระคับ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: atit ที่ ตุลาคม 30, 2009, 16:17:57 PM
procedure Label3OnPrint;
begin
      label3.visible:= DBPipeline['pttype'] = (10,20,23,50)  ;
end;

ตัวนี้ต้องแก้อย่างไรครับ ;D
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: SIWIT ที่ ตุลาคม 31, 2009, 14:31:27 PM
ดันครับ แวะเข้ามาอ่านบ่อยและก็จะถามบ่อยด้วย อิิิอิ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: armds ที่ ตุลาคม 31, 2009, 15:00:12 PM
ลองดูแบบนี้ดูครับ

procedure Label3OnPrint;
begin
    test := '20';
    case strtoint(test) of
      10 : label3.visible := true;
      20 : label3.visible := true;
      25 : label3.visible := true;
      30 : label3.visible := true;
      40 : label3.visible := false;
      end;

end;
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: atit ที่ พฤศจิกายน 02, 2009, 16:05:42 PM
ขอบคุณครับพี่อาร์ม คิดถึง select case เหมือนกันแต่ไม่แน่ใจเรื่องรูปแบบคำสั่งครับ ;D

สรุปแล้วเป็นแบบนี้ครับ

procedure Label3OnPrint;
begin
     test := DBPipeline['pttype'];
    case strtoint(test) of
      10 : label3.visible := true;
      20 : label3.visible := true;
      25 : label3.visible := true;
      30 : label3.visible := true;
    else
      label3.visible := false;
    end;
end;
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: SIWIT ที่ ธันวาคม 08, 2009, 23:26:53 PM
อยากทราบคำสั่งเกี่ยวกับ การ update ครับ ผมอยากจะ update field cid ของ patient ครับโดยดึงข้อมูลจาก hipdata ครับไม่ทราบ syืtax ครับผม
ช่วยหน่อยครับผม

update patient  set patient.cid=(hipdata.cid) from hipdata inner join patient on patient.fname=hipdata.fname where patient.lname=hipdata.lname and patient.birthday=hipdata.birthdate
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: snhos ที่ ธันวาคม 09, 2009, 11:13:03 AM
ขอแนะนำก่อนน่ะครับว่า การอัพเดทตามคำสั่งที่ส่งมามันมีเงื่อนไขที่เขาไม่นิยมทำกันเพราะ อ้างเอาชื่อนามสกุล วันเดือนปีเกิดที่เหมือนกัน  เป็นเป็นเงื่อนไขที่แปรปรวนง่าย  เช่น นายกันต์ มาดี (อยู่ใน patient) นายกัน มาดี (มีอยู่ใน Hipdata)ถึงแม้จะเป็นคนเดียวกัน แต่ข้อมูลมันไม่เท่ากันมันจะอัพเดทไม่ได้
สู้เรากรอกข้อมูลผ่าน patient (หน้างานห้องบัตรให้ถูกต้องทีสุดดีกว่า)
แต่ถ้าจะทำ ควรอัพเดทฟิลอื่นดีกว่า เช่น อัพเดท สิทธิ์ติดตัวที่ตาราง patient ให้เป็นเหมือนตาราง hipdata ดีกว่า
เวลาส่งตรวจจะได้ไม่ต้องกังวลค่อยตรวจสอบจาก hipdata
ของเดิม
update patient  set patient.cid=(hipdata.cid) from hipdata inner join patient on patient.fname=hipdata.fname where patient.lname=hipdata.lname and patient.birthday=hipdata.birthdate

น่าจะแก้เป็น (ลองถามท่านอื่นดูด้วยน่ะครับ) เป็นการอัพเดทสิทธิ์ ตัวอย่าง
UPDATE patient p inner join hipdata h ON h.cid=p.cid SET p.pttype=h.pttype; เป็นต้น
น่าจะเกิดประโยชน์มากกว่า

ปล.
1 บางครั้ง cid ที่ได้จาก สปสช. ก็อาจไม่ถูกเสมอไป  ผมเคยตรวจพบเจอ  บางรายมี cid 2 รายการ 
2 ก่อนจำ run คำสั่งที่เกี่ยวกับ update  หรือ insert หรือ delete ควร backup ตาราง หรือ ฐานข้อมูลไว้ก่อน ปลอดภัยทีสุด
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: SIWIT ที่ ธันวาคม 11, 2009, 10:31:28 AM
หลังจาก update จาก hipdata แล้ว ก็ upใน ptcardno ด้วยครับ Cradit by PERJER ครับ
update ptcardno pc,patient p
set pc.cardno=concat(substring(p.cid,1,1),"-",substring(p.cid,2,4),"-",
substring(p.cid,6,5),"-",substring(p.cid,11,2),"-",substring(p.cid,13,1))
where p.hn=pc.hn
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: saiphon ที่ กุมภาพันธ์ 02, 2010, 22:42:51 PM
ช่วย..แบ่งปันความรู้ครับ..เยี่ยมๆๆๆๆ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: onlinelp ที่ พฤษภาคม 04, 2010, 22:08:10 PM
 ::) ::)
สงสัยต้องเริ่มอ่านใหม่อีกรอบแล้วครับ
ไม่ทราบมาก่อนเลยครับว่ามีกระทู้นี้อยู่
เมื่อก่อนผมศึกษาจาก code เก่าๆที่อยู่ใน Report Designer
แล้วเอามาปะติดปะต่อเอาเอง ปัจจุบันก็พอไปได้แบบงูไหลตามน้ำอะน่ะครับ :-* :-*
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: SIWIT ที่ กันยายน 03, 2010, 11:58:07 AM
ถาม sql เกี่ยวกับ group by หน่อยพอดีว่าผมต้องการค่า น้ำหนักล่าสุดของ แต่ละ Hn ผม

select hn,bw,vn from opdscreen where bw<>"0" group by hn,vn desc

มันเลือก vn น้อยมาครับ เห็นว่า group by กับ order by ใช้ด้วยกันไม่ได้ทำไงดีครับ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: redfireball ที่ กันยายน 03, 2010, 14:09:26 PM
ถาม sql เกี่ยวกับ group by หน่อยพอดีว่าผมต้องการค่า น้ำหนักล่าสุดของ แต่ละ Hn ผม

select hn,bw,vn from opdscreen where bw<>"0" group by hn,vn desc

มันเลือก vn น้อยมาครับ เห็นว่า group by กับ order by ใช้ด้วยกันไม่ได้ทำไงดีครับ

set @dt1 := '2010-01-01';
set @dt2 := '2010-01-31';

SELECT p.hn,concat(pname,p.fname,space(2),p.lname) as ptnames,max(v.vstdate) as visitdate_now,
(select case when o1.bw is null or o1.bw = 0 then "N/A" else o1.bw end from opdscreen o1 where o1.hn = v.hn and o1.vstdate between @dt1 and @dt2 order by o1.vstdate desc limit 1) as bw_now
from vn_stat v
inner join opdscreen o on  o.vn = v.vn
left join patient p on p.hn = v.hn
where v.vstdate between @dt1 and @dt2
group by v.hn

ลองดูครับ  ;) ;)
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: SIWIT ที่ กันยายน 07, 2010, 12:23:00 PM
(select case when o1.bw is null or o1.bw = 0 then "N/A" else o1.bw end from opdscreen o1 where o1.hn = v.hn and o1.vstdate between @dt1 and @dt2 order by o1.vstdate desc limit 1) จาก script นี้
ให้เลือก น้ำหนัก vn ล่าสุดมาใช่มั้ยครับแล้วถ้า vn ล่าสุดไม่ได้ใส่น้ำหนักมาแต่ก่อนหน้าไปอีก visit เค้าใส่น้ำหนักมาทำไงครับตอนนี้ผมทำได้ประมาณนี้นะครับ แต่จริงๆอยากให้อยู่columเดียวกันเลย

sELECT p.hn,concat(pname,p.fname,space(2),p.lname) as ptnames,max(v.vstdate) as visitdate_now,
(select case when o1.bw is null or o1.bw = 0 then "N/A" else o1.bw end from opdscreen o1 where o1.hn = v.hn and o1.vstdate between "2010-01-01" and "2010-03-01"  order by o1.vstdate desc limit 1) as bw_now
,(select case when o1.bw is null or o1.bw = 0 then "N/A" else o1.bw end from opdscreen o1 where o1.hn = v.hn and o1.vstdate between "2010-01-01" and "2010-03-01"   order by o1.vstdate desc limit 1,1) as bw_now2
,(select case when o1.bw is null or o1.bw = 0 then "N/A" else o1.bw end from opdscreen o1 where o1.hn = v.hn and o1.vstdate between "2010-01-01" and "2010-03-01"   order by o1.vstdate desc limit 2,1) as bw_no
from vn_stat v
inner join opdscreen o on  o.vn = v.vn
left join patient p on p.hn = v.hn
where v.vstdate between "2010-01-01" and "2010-03-01"
group by v.hn
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: redfireball ที่ กันยายน 08, 2010, 00:01:45 AM
set @dt1 := '2010-01-01';
set @dt2 := '2010-01-31';

SELECT p.hn,concat(pname,p.fname,space(2),p.lname) as ptnames,max(v.vstdate) as "วันที่มาล่าสุด",
(select o1.vstdate from opdscreen o1 where o1.hn = v.hn and DATEDIFF(o1.vstdate,@dt2) <= 0 and (o1.bw is not null or o1.bw <> 0) order by o1.vstdate desc limit 1) as "วันที่มีค่าน้ำหนัก",
(select o1.bw from opdscreen o1 where o1.hn = v.hn and DATEDIFF(o1.vstdate,@dt2) <= 0 and (o1.bw is not null and o1.bw <> 0) order by o1.vstdate desc limit 1) as "น้ำหนัก"
from vn_stat v
inner join opdscreen o on  o.vn = v.vn
left join patient p on p.hn = v.hn
where v.vstdate between @dt1 and @dt2
group by v.hn

เอาวันที่ลงค่าน้ำหนักล่าสุด ที่ไม่เกินวันที่เลือก @dt2 ประมาณนี้ ได้ไมครับ  :) :)
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: SIWIT ที่ กันยายน 08, 2010, 09:03:43 AM
datediff ช่วยยังไงหรอครับผมไม่ทราบจริงๆ ครับ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: SIWIT ที่ กันยายน 08, 2010, 09:13:52 AM
ใช้ได้ครับสุดยอดมากๆเลย แต่อยากใช้ datediff คือ ? ใช้ยังไง อ่านแล้วไม่เข้าใจครับ
โค๊ด: XML
  1.  
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: redfireball ที่ กันยายน 08, 2010, 10:02:56 AM
ใช้ได้ครับสุดยอดมากๆเลย แต่อยากใช้ datediff คือ ? ใช้ยังไง อ่านแล้วไม่เข้าใจครับ
โค๊ด: XML
  1.  
ครับ datediff คือคำสั่งสำหรับหา "ผลต่าง" ของ "วันที่" 2 ค่า ครับ
ยังไงลองใช้ดูครับ ไม่เข้าใจคำสั่งไหน ยินดีให้คำปรึกษาครับ หรือจะศึกษาเพิ่มเติมได้ที่ mysql ได้ที่
http://www.java2s.com/Tutorial/MySQL/CatalogMySQL.htm ผมลืมคำสั่งไหน ก็เข้าเว็บนี้ครับ  :) :) :)
กับ http://www.w3schools.com/ เว็บนี้รวมหลายๆอย่างไว้ ดีมากครับ  :) :) ผมเข้าประจำ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: udomchok ที่ กันยายน 08, 2010, 15:21:08 PM
ดูตัวอย่างจากรายงานนี้ครับ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: SIWIT ที่ ตุลาคม 14, 2010, 09:50:38 AM
มีคำถามอีกครับ คือผมจะเลือกผู้ป่วยที่ยังไม่ตายนะครับหรือถ้าตายก็ตายหลังจากวันที่ที่กำหนดเขียนงี้ถูกมั้ยครับ

(p.death<>"Y" and p.deathday is null  or p.deathday>"2009-10-01") ผมงงกับวงเล็บอะไม่รู้ใส่ถูกป่าว

*******************

select count(distinct(o.hn)) as d from ovstdiag o ,patient p
where o.hn=p.hn  and o.icd10 between "e10" and "e109" and (p.death<>"Y" and p.deathday is null  or p.deathday>"2009-10-01")
and o.vstdate<"2009-10-01"

หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: SIWIT ที่ ตุลาคม 14, 2010, 12:03:43 PM
มีเงื่อนไขเพิ่มครับรายเก่าต้องมารับบริการ 2 ครั้งขึ้นไป ผมเลยเพิ่มเป็น

having count(o.vn)>2

*****************

select  count(distinct(o.hn))
from ovstdiag o ,patient p
where o.hn=p.hn  and o.icd10 between "e10" and "e109"
and (p.death<>"Y" and deathday is null or deathday>="2009-10-01")  and o.vstdate<"2009-10-01"   having count(o.vn)>2

แต่มันนับ o.vn ทั้งหมดครับมันไม่ได้นับราย hn ผมเลยไม่รู้จะเขียนไงโดยต้องการให้ออกแต่ยอดนะครับ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: SIWIT ที่ ตุลาคม 14, 2010, 16:00:34 PM
ลองอันนี้ก็ค้างคับ

select count(distinct(o.hn)) as d
from ovstdiag o ,patient p
where o.hn=p.hn  and o.icd10 between "e110" and "e119"
and(p.death<>"Y" and p.deathday is null or p.deathday>"2009-10-01")
and o.vstdate<"2009-10-01"
and o.hn in (select ov.hn from ovstdiag ov
where ov.icd10 between "e110" and "e119"
and ov.vstdate<"'+ds1+'" group by ov.hn having count(ov.vn)>2
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: SIWIT ที่ ตุลาคม 14, 2010, 17:36:59 PM
อยากถามเกี่ยวกับการการแปลงวันที่ครับ สมมุติว่าเราทำรายงานปีงบประมาณ แล้วเราเลือกวันที่มาเป็น 2009-10-01 ซึ่งมันเป็น ปีงบ 53 ผมจะแปลงไงหรอครับผม ตอนนี้ใน variable ผมทำแบบนี้นะครับ

  Value := GetSQLStringData('select timestampdiff(year,"1956-10-01","'+ds1+'") ');

มันจะลบกันได้ 53 พอดีอะครับ อยู่ได้อีกประมาณ 47 ปี อิอิ  แต่ได้การจัดการเกี่ยวกับวันที่แบบเทห์อะแบบว่า เอาปีที่เลือกแล้ว + อีก 1 อะครับ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: pop_hosxp ที่ ตุลาคม 14, 2010, 17:46:37 PM
อยากถามเกี่ยวกับการการแปลงวันที่ครับ สมมุติว่าเราทำรายงานปีงบประมาณ แล้วเราเลือกวันที่มาเป็น 2009-10-01 ซึ่งมันเป็น ปีงบ 53 ผมจะแปลงไงหรอครับผม ตอนนี้ใน variable ผมทำแบบนี้นะครับ

  Value := GetSQLStringData('select timestampdiff(year,"1956-10-01","'+ds1+'") ');

มันจะลบกันได้ 53 พอดีอะครับ อยู่ได้อีกประมาณ 47 ปี อิอิ  แต่ได้การจัดการเกี่ยวกับวันที่แบบเทห์อะแบบว่า เอาปีที่เลือกแล้ว + อีก 1 อะครับ

ลอง apply โดยใช้ตาราง stock_bdg_year สิครับ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: udomchok ที่ ตุลาคม 14, 2010, 17:59:18 PM
ลองดูตัวอย่างนี้ครับ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: SIWIT ที่ ตุลาคม 14, 2010, 19:08:48 PM
ขอบคุณ pop_hosxp และ ท่าน udomchok มากครับผม
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: udomchok ที่ ตุลาคม 14, 2010, 23:15:51 PM
กด Thanks  ก็ดีนะครับ  :D :D :D
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: SIWIT ที่ ตุลาคม 14, 2010, 23:21:13 PM
เรียบร้อยคับ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: bughumnoy ที่ กรกฎาคม 07, 2011, 10:10:30 AM
ขอบคุณครับ ;D
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: บิ๊กเบิร์ด ที่ สิงหาคม 29, 2012, 10:34:38 AM
สอบถามท่านผู้เชี่ยวทั้งหลายครับ ถ้าผมต้องการเขียนตรวจสอบ type_area ว่า

ถ้า type_area มีค่าน้อยกว่า 4

ให้แสดงค่าดังกล่าวออกมา แต่ให้เป็นตัวอักษรสีแดง

ถ้าไม่ใช่ ให้แสดงค่า DBpipeline_Type_Area ออกมา

ผมทำได้ดังนี้

   if (DBPipeline['type_area'] < 4 )  then
      begin
        value:='DBPipeline['type_area']';
      end
     else
      begin
        value:= DBPipeline['type_area'];
      end;

แต่ติดตรองเงื่อนไขแรกครับ อยากให้เป็นตัวอักษรสีแดงครับ

รบกวนด้วยนะครับ  ขอบคุณ ล่วงหน้าครับ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: BBT Hospital ที่ ธันวาคม 03, 2012, 06:35:23 AM
ลองดูนะครับ สมมุติว่าตัวแปรที่ใช้ชื่อ Variable10

สอบถามท่านผู้เชี่ยวทั้งหลายครับ ถ้าผมต้องการเขียนตรวจสอบ type_area ว่า

ถ้า type_area มีค่าน้อยกว่า 4

ให้แสดงค่าดังกล่าวออกมา แต่ให้เป็นตัวอักษรสีแดง

ถ้าไม่ใช่ ให้แสดงค่า DBpipeline_Type_Area ออกมา

ผมทำได้ดังนี้

   if (DBPipeline['type_area'] < 4 )  then
      begin
        value:='DBPipeline['type_area']';
     Variable10.Font.color:=ClRed;      end
     else
      begin
        value:= DBPipeline['type_area'];
     Variable10.Font.color:=ClBlack;     
      end;

แต่ติดตรองเงื่อนไขแรกครับ อยากให้เป็นตัวอักษรสีแดงครับ

รบกวนด้วยนะครับ  ขอบคุณ ล่วงหน้าครับ
หัวข้อ: Re: sql วันละคำ กับ perjer
เริ่มหัวข้อโดย: k_toedkiets ที่ ธันวาคม 03, 2012, 08:19:45 AM
มีหนังสือแนะนำเกี่ยวกับหารใช้คำสั่ง mysql บ้างไหมครับ อ.ทั้งหลาย....Admin มือใหม่กำลังหัดเดินครับ...