วันเสาร์, ตุลาคม 29, 2548

apt-get update

กลับจากไปเที่ยวมา ก็ไม่ค่อยได้ใช้คอมพิวเตอร์เท่าไหร่ เนื่องจากแม่บ้านใช้ค้นคว้างานที่จะต้องไป Present ให้อาจารย์ที่ปรึกษาฟังเกี่ยวกับการค้นคว้าสิ่งที่ได้เรียนรู้มาตลอดระยะเวล าที่เรียนมา ปีกว่าๆ พึ่งจะมีโอกาสใช้เมื่อคืนนี้เอง ก็กะว่าจะ update ซะหน่อย ที่ไหนได้ พอสั่ง apt-get update ก็ได้ข้อความดังนี้

debian:/home/uthai# apt-get update
Get:1 http://linux.thai.net etch/main Packages [3477kB]
Err http://linux.thai.net etch/main Packages
Error reading from server - read (104 Connection reset by peer)
Hit http://linux.thai.net etch/main Release
Hit http://linux.thai.net etch/contrib Packages
Hit http://linux.thai.net etch/contrib Release
Hit http://linux.thai.net etch/non-free Packages
Hit http://linux.thai.net etch/non-free Release
Hit http://linux.thai.net ./ Packages
Ign http://linux.thai.net ./ Release
Get:2 http://linux.thai.net etch/main Sources [1334kB]
Err http://linux.thai.net etch/main Sources
Error reading from server Remote end closed connection
Hit http://linux.thai.net etch/main Release
Hit http://linux.thai.net etch/contrib Sources
Hit http://linux.thai.net etch/contrib Release
Hit http://linux.thai.net etch/non-free Sources
Hit http://linux.thai.net etch/non-free Release
Failed to fetch http://linux.thai.net/pub/mirrors/debian/dists/etch/main/binary- i386/Packages.gz Error reading from server - read (104 Connection reset by peer )
Failed to fetch http://linux.thai.net/pub/mirrors/debian/dists/etch/main/source/ Sources.gz Error reading from server Remote end closed connection
Reading Package Lists... Done
W: Couldn't stat source package list http://linux.thai.net etch/main Packages (/ var/lib/apt/lists/linux.thai.net_pub_mirrors_debian_dists_etch_main_binary-i386_ Packages) - stat (2 No such file or directory)
W: You may want to run apt-get update to correct these problems
E: Some index files failed to download, they have been ignored, or old ones used instead.
debian:/home/uthai#
จ ริงแล้วผมเคยเจอเหตุการณ์เช่นนี้มาแล้ว แต่ก็ลองตื้อดู ครั้งสองครั้งก็โอเช แต่คราวนี้ไม่แฮะ ออกมารูปนี้ตลอด เลย apt-get อะไรต่อไปอีกไม่ได้ ใครเจอแบบนี้แก้ไขได้อย่างไร รบกวนเล่าให้ฟังเป็นวิทยาทานด้วยนะครับ จะว่าเน็ต้ช้าก็ใช่ แต่ไม่น่าจะช้าจนทำอะไรไม่ได้ขนาดนี้ ตอนที่บล็อกอยู่นี่สปีดก็ใช้ได้นะครับ เดี๋ยวจะลองค้นดูหน่อย มันอึดอัดซะเหลือเกิน โฮ่ย

1587 กิโลเมตร

ไม่ได้มาบล็อกซะนาน กลางเดือนที่ผ่านมาไปเที่ยวที่พัทยา จริงๆแล้วก็ไม่เชิงว่าไปเที่ยว น่าจะไปเป็นเพื่อนแม่บ้านกับเด็กๆ ซะมากกว่า แม่บ้านเค้าลงทะเบียนประชุมวิชาการประจำปี ที่สมาคมศิษย์เก่ารังสีเทคนิค โรงพยาบาลจุฬาลงกรณ์ สภากาชาดไทยจัด ที่พัทยา โรงเรียนเด็กๆ ก็ยังไม่เปิด ก็ถือเป็นโอกาสดีที่จะได้พาเด็กไปเที่ยวพักผ่อนกัน หลังจากที่ผัดผ่อนมานานแล้ว ก็ไปกันทั้งบ้าน พ่อ แม่ ลูกๆ ออกเดินทางตั้งแต่เช้าวันที่ 18 เวลาประมาณ ตีสี่ครึ่ง (ช้ากว่ากำหนดการไปสองชั่วโมง เนื่องจากนอนเพลินไปหน่อย) ก็เริ่มเดินทางจากลี้ ไปตามถนนพหลโยธินสายเก่า เหอะ เหอะ ผ่านเส้นทางที่ระยะทางไม่มาก แต่ใช้เวลาประมาณ หนึ่งชั่วโมง เนื่องจากความคดเคึ้ยวของเส้นทางที่ลัดเลาะไปตามภูเขา โค้งซ้าย โค้งขวา จนจำไม่ได้ว่ามากเท่าไหร่ ถึงอำเภอเถินก็เกือบสว่าง ใช้เวลาอีกประมาณชั่วโมงครึ่งก็ถึงจังหวัดตาก แล้วก็แวะทานข้าวเช้าแถวๆ ก่อนถึงกำแพงเพชร ก็ขับรถไปเรื่อยๆ ผ่านนครสวรรค์ ตอนนี้อากาศเริ่มร้อนแล้วก็ต้องขับด้วยความเร็วที่ต้องฝืนใจเหยียบ (ความจริงผมเลิกขับรถเร็วมานานแล้ว ตั้งแต่มีลูกคนแรก) ต้องวิ่งขวาตลอดเนื่องจากช่องทางด้านซ้าย ขรุขระ มีหลุม บ่อ แถมยังมีคลื่น อีกเป็นช่วงๆ ทำให้ต้องคอยระวังรถที่มาจากด้านหลัง รู้สึกว่าเริ่มเครียดกับการเดินทางมากขึ้น ช่วงตั้งแต่นครสวรรค์ จนถึงชัยนาท มองเห็นว่าข้างทางมีหนูนา ปิ้งขายเป็นระยะๆ แปลกใจมากว่าไปหาหนูนาจากไหนมาขายกันเหรอ ทุ่งนาก็เขียวอยู่ มันเป็นไปไม่ได้ที่ในขณะที่ทุ่งนายังไม่ได้เก็บเกี่ยวเนี่ยมักจะไม่ค่อยมีหน ูนานะ ที่บ้านผมกว่าจะมีหนูนาให้กินเนี่ย มันก็ต้องเกี่ยวข้าวเสร็จ ประมาณเดือนหรือสองเดือนนู่น เออ สงสัยว่าจะอิมพอร์ตมาจากที่อื่นๆ ที่น่าสนใจคือมีงูเห่าขายกันด้วย ขายกันเป็นๆ ตัวก็ไม่ได้ใหญ่โตอะไรมากมาย ผมก็ได้แต่ดูอยู่ห่างๆ เนื่องจากอากาศเริ่มร้อนมาก แล้วต้องรีบเดินทางด้วย ก็แวะพักเติมน้ำมันที่อยุธยา ก่อนที่จะเดินทางต่อในเส้นทางหมายเลข 9 (มอเตอร์เวย์) ก็ไปเรื่อยๆ จนแยกเข้าหมายเลข 7 (ถนนหมายเลข 34 เดิม) ก่อนที่จะแยกเข้าพัทยาที่แหลมฉบัง ไปตามถนนหมายเลข 3 (สุขุมวิท) จนถึงที่พัก(โรงแรม Wellcome Plaza) พัทยาใต้ ประมาณ 3 โมงครึ่ง เอ้อเดินทางกัน 11 ชั่วโมงครึ่งเชียวเร๊อะ ทำงัยได้ล่ะครับ รถก็เก่าพอสมควร ตอนวิ่งอยู่บนมอเตอร์เวย์ ผมสงสัยอยู่เหมือนกันว่าทำไมคนขับรถที่ขับแซงผมไปถึงเหลียวมองผมทุกที มานึกๆดูก็คงจะรำคาญที่ขับเร็วไม่พอ


ส องสามวันที่อยู่พัทยาก็ไม่มีกิจกรรมอะไรทำมากไปกว่า พาเด็กไปเล่นน้ำทั้งน้ำจืดและน้ำทะเล (เล่่นมันทั้งวัน เด็กภูเขาก็เงี๊ยะ เห็นทะเลทีก็ตื่นเต้น ) ผมพึ่งมารู้ทีหลังว่าเค้าแอบเอาขวดไปด้วยเพื่อที่จะเอาน้ำทะเลใส่ไปฝาก อา น้า ป้า ทั้งหลายที่อำแกไว้ก่อนจะมา 55555 ช่วงนี้ที่พัทยายังเป็นโลว์ซีซันอยู่เนื่องจากมีฝนตกอยู่บ้าง และน้ำทะเลยัง่ดำมากอยู่ (หรือมันก็เป็นอย่างงี๊) ที่น่าขำก็คือว่ามีอยู่วันนึงพาเด็กๆ ไปเที่ยวที่สถาบันวิทยาศาสตร์ทางทะเลที่บางแสน (อยู่ข้างๆ ม.บูรพา) ก็คิดถึงเหน่ง ขึ้นมา แต่ก็ไม่ได้โทรไปคุยด้วย พออีกวันก็โทรไปคุยด้วยปรากฏว่า เหน่งมาทำงานที่โรงพยาบาล ม.บูรพาพอดี เออ หัวเราะกันใหญ่ ไอ้เราก็เอ๋อ วันนั้นถ้าโทรหาก็เจอกันแล้ว ที่พัทยานี่ระบบการจราจรเค้าค่อนข้างตามใจคนขับมากเป็นพิเศษ (ขับกันมั่วมั่กมาก) ปาดซ้ายปาดขวากันให้มันส์ไปหมด คงจะเป็นเพราะว่ามีนักท่องเที่ยวชาวต่างชาติที่นิยมเช่ารถ ขับเที่ยวกันมาก ทางตำรวจก็คงจะหยวนๆ เพราะทางกวดขันกันจริงๆ ก็คงจะจับ ปรับกันไม่ไหว อาจจะทำให้เสียบรรยากาศการท่องเที่ยวไปด้วย คนไทยก็เลยขับตามใจตัวเองกันใหญ่ น้องสาวผมที่ทำงานที่ ICU (intensive care unit) โรงพยาบาลกรุงเทพ-พัทยา ก็เล่าให้ฟังว่ามีคนไข้ที่ถูกยิงเนื่องจากการขับรถปาดกันมารักษาที่โรงพยาบาลบ่อยๆ ทำให้ผมรู้สึกเสียวสันหลังขึ้นมาทันที

ว ันที่ 21 ก็เดินทางกลับกันกว่าจะเช็คเอ้าท์ได้ก็เกือบเที่ยง ออกจากที่พักกันจริงๆ ก็เที่ยงครึ่งแล้ว แวะที่หนองมนเพื่อซื้อของฝากอีกครั้งหลังจากวันก่อนไปซื้อที่ตลาดนาเกลือ แล้วได้ของไม่ครบ รถเยอะมากลืมนึกไปว่ามีวันหยุดชดเชยในวันจันทร์ที่ 24 อีกวันหนึ่งมิน่าการจราจรค่อนข้างคับคั่งเป็นพิเศษ ตั้งแต่สุขุมวิท มาถึงสายเอเชีย ก็ยังแน่นอยู่ มาค่อยยังชั่วหน่อยก็ตั้งแต่นครสวรรค์ขึ้นมา ช่วงขากลับรู้สึกเพลีย ก็เลยให้แม่บ้านออกแรงนิดนึงตั้งแต่สิงห์บุรี จนถึงนครสวรรค์ แวะทานข้าวเย็นกัน ตอนหกโมงกว่าๆ ทีนี้ความที่คิดถึงบ้านอย่างแรงก็เลยเหยียบคันเร่งเป็นพิเศษ แต่ก็ยังใช้ช่องทางขวาเหมือนเดิม เฮ้อ กลับถึงบ้านก็ 5 ทุ่มครึ่ง โดยสวัสดิภาพ รวมระยะทางก็ 1587 กิโลเมตร นับว่าโหดสำหรับรถยนต์นั่งขนาด 1500 ซีซี และคนขับที่ไม่ค่อยได้ขับทางไกลๆ อย่างผม

นึกๆ อยู่ว่าครั้งหน้าจะไปเที่ยวที่ไหนกันอีก เริ่มชอบกับการขับรถไปกันหลายๆคน พร้อมหน้าพร้อมตากันเยอะๆ เด็กก็อึดกันมาก ไม่หลับกันเลยคุยกันบ้าง เล่นกันบ้าง ทะเลาะกันบ้าง อยู่ที่เบาะหลัง รู้สึกว่าได้เติมพลังให้กับชีวิตอีกมากทีเดียว สดชื่นขึ้นถึงแม้ว่าจะล้าจากการเดินทาง แต่ก็พร้อมที่จะกลับไปลุยงานที่โรงพยาบาลต่อ

วันศุกร์, ตุลาคม 14, 2548

SQL ตอนที่ 5

วันสองวันที่ผ่านมา คุณ SP (น่าจะมี & คั่นกลางนะ) ถ้าจำไม่ผิดก็อยู่ที่ กระบุรี ระนอง ถามผ่านเวบบอร์ดมาว่า ทำอย่างไรถึงจะใช้ SQL หารายงาน 505 โดยแยกเป็นกลุ่มอายุต่างๆ ได้อย่างไร ฮื่อไอ้เราก็ดันตอบไปว่าไม่ยาก (ความคิดตอนนั้นคิดว่าไม่ยาก) แต่เมื่อผ่านมาได้ประมาณ 2-3 ชั่วโมงก็รู้ว่ามันหินนะ คือต้องเล่นกับวันที่ ที่เป็น varchar อีกแล้วล่ะ แต่ก็ไม่เป็นไร เราก็ลองมาทำดู ก็พอเห็นแนวอยู่บ้าง ไหนๆก็ลองทำแล้วบันทึกไว้ซะหน่อย เตือนความจำไว้ก็ไม่เสียหายอะไร เลยมีเรื่องมาเล่าสู่กันอีกแล้ว หลังจากหมดมุขไปนาน ฮ่าๆๆๆๆ

โจทย์มีอย่างนี้ครับ ช่วงอายุที่คุณ SP ต้องการแบบนี้

คนไข้กลุ่ม 505 ช่วงอายุ
0-4
5-9
10-14
15-19
20-24
25-29
30-34
35-39
40-44
45-49
50-54
55-59
60-64
55-69
70-74
75-79
80-84
85+

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

  1. กลุ่มอายุ

  2. อายุเริ่มต้น

  3. อายุสิ้นสุด


แต่ผมว่าเพิ่มเลขกำกับกลุ่มไว้เป็นฟิลด์แรกเหอะ เวลาจัดเรียงจะทำให้มันง่ายอีก SQL สำหรับสร้างตารางก็น่าจะประมาณนี้ ตั้งชื่อตารางว่า r_age_group

CREATE TABLE r_age_group
(
age_code int4,
age_description varchar,
age_begin varchar,
age_end varchar
)

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

INSERT INTO r_age_group VALUES (1,'อายุ 0-4 ปี','0','48');

เหอะ เหอะ พอเรคคอร์ดที่สองสังเกตได้ว่า ทำไมต้องเป็น 5-9 ปี ด้วยอ่ะ แทนที่จะเป็น 4-9 ก็เรคคอร์ดแรกมันจบที่อายุ 48 เดือน มันก็ควรจะเริ่มต้นที่ 49 ซึ่งก็น่าจะอายุ 4 ปีอยู่ ก็กลับไปถามอีก เค้า (คนเดิม) ก็บอกมาว่า ที่คุณ SP ให้มาน่ะถูกแล้ว มากกว่า 48 เดือน ก็นับเป็น 5 ปีแล้ว เออ พึ่งรู้นะเนี่ย ขอคอนเฟิอร์มด้วยนะครับ จะได้กลับไปเฉ่งน้องคนนี้ ถ้าเกิดว่าข้อมูลที่ให้มาน่ะไม่ถูกต้อง เอาวะ ว่าแล้วก็นั่ง INSERT เข้าไปอีกประมาณนี้

INSERT INTO r_age_group VALUES (2, 'อายุ 5 ถึง 9 ปี', '49', '108');
INSERT INTO r_age_group VALUES (3, 'อายุ 10 ถึง 14 ปี', '109', '168');
INSERT INTO r_age_group VALUES (4, 'อายุ 15 ถึง 19 ปี', '169', '228');
INSERT INTO r_age_group VALUES (5, 'อายุ 20 ถึง 24 ปี', '229', '288');
INSERT INTO r_age_group VALUES (6, 'อายุ 25 ถึง 29 ปี', '289', '348');
INSERT INTO r_age_group VALUES (7, 'อายุ 30 ถึง 34 ปี', '349', '408');
INSERT INTO r_age_group VALUES (8, 'อายุ 35 ถึง 39 ปี', '409', '468');
INSERT INTO r_age_group VALUES (9, 'อายุ 40 ถึง 44 ปี', '469', '528');
INSERT INTO r_age_group VALUES (10, 'อายุ 45 ถึง 49 ปี', '529', '588');
INSERT INTO r_age_group VALUES (11, 'อายุ 50 ถึง 54 ปี', '589', '648');
INSERT INTO r_age_group VALUES (12, 'อายุ 55 ถึง 59 ปี', '649', '708');
INSERT INTO r_age_group VALUES (13, 'อายุ 60 ถึง 64 ปี', '709', '768');
INSERT INTO r_age_group VALUES (14, 'อายุ 65 ถึง 69 ปี', '769', '828');
INSERT INTO r_age_group VALUES (15, 'อายุ 70 ถึง 74 ปี', '829', '888');
INSERT INTO r_age_group VALUES (16, 'อายุ 75 ถึง 79 ปี', '889', '948');
INSERT INTO r_age_group VALUES (17, 'อายุ 80 ถึง 84 ปี', '949', '1008');
INSERT INTO r_age_group VALUES (18, 'อายุตั้งแต่ 85 ปีขึ้นไป', '1009', '10000');

เผื่ออายุให้ตั้งหมื่นเดือนนะ สำหรับเรคคอร์ดสุดท้าย อิ อิ

แล้วก็ยังมีอีกตารางนึงนะ ที่ต้องสร้างคือตารางที่เก็บกลุ่มของโรคสำหรับรายงาน 505 ผมทำไว้ให้แล้วลองไปตรวจสอบความถูกต้องอีกทีแล้วกัน นะ ทั้งสองตารางมีให้ดาวน์โหลดข้างล่าง ไม่ต้องทำตามหรอก ทำไว้ให้แล้ว ตั้งใจอ่านให้เข้าใจคอนเซ็ปต์ก็พอแว๊ว ทีนี้ก็มาเริ่มสร้าง SQL กันเลย คิดมาได้ขนาดนี้

SELECT
r_age_group.age_description AS description
,COUNT(t_visit.t_visit_id) AS total
FROM
t_visit
,t_patient
,t_diag_icd10
,disease_505_code
,r_age_group
WHERE
t_visit.t_patient_id=t_patient.t_patient_id
AND t_visit.t_visit_id=t_diag_icd10.diag_icd10_vn
AND t_visit.f_visit_type_id='1'
AND t_visit.f_visit_status_id='3'
AND (t_diag_icd10.diag_icd10_number BETWEEN (disease_505_code.begin_code) and (disease_505_code.end_code))
AND (SUBSTRING(t_visit.visit_financial_discharge_time,0,11) BETWEEN '2548-08-01' and '2548-08-05')
AND ((to_date(substr(t_visit.visit_financial_discharge_time,0,11),'yyyy-mm-dd') -
to_date(substr(t_patient.patient_birthday,0,11),'yyyy-mm-dd'))/30 BETWEEN (r_age_group.age_begin) and (r_age_group.age_end))

GROUP BY
r_age_group.age_description
,r_age_group.age_code
ORDER BY
r_age_group.age_code

มีอยู่สองบรรทัดที่อยากอธิบายเพิ่มเติม บรรทัดแรกคือ

  1. AND (t_diag_icd10.diag_icd10_number BETWEEN (disease_505_code.begin_code) and (disease_505_code.end_code))
    หมายความว่า ให้เลือกเอา รหัส icd10 ที่อยู่ระหว่างค่าเริ่มต้น กับค่าสิ้นสุด ของแต่ละกลุ่มในตาราง disease_505_code เท่านั้นนะ นอกเหนือจากนี้ไม่ต้องทำการเลือกมา

  2. แล้วบรรทัดต่อมาที่สำคัญคือ AND ((to_date(substr(t_visit.visit_financial_discharge_time,0,11),'yyyy-mm-dd') -
    to_date(substr(t_patient.patient_birthday,0,11),'yyyy-mm-dd'))/30 BETWEEN (r_age_group.age_begin) and (r_age_group.age_end))

    ขอแยกให้ดูชัดๆ t_visit.visit_financial_discharge_time คือเวลาที่จำหน่ายทางการเงิน มีค่าของฟิลด์เป็น varchar ในฟอรแมต แบบนี้ 2548-08-01,15:30:10 เราก็ตัดมาเฉพาะ ปี เดือน วัน โดยใช้ฟังก์ชัน SUBSTRING(t_visit.visit_financial_discharge_time,จากตำแหน่งที่ศูนย์,ความยาวของสตริงที่ต้องการตัด) --->substr(t_patient.patient_birthday,0,11) ก็ได้สตริงแบบนี้ --> 2548-08-01 ทีนี้เราก็มาทำให้เป็นวันที่ซะ โดยการใช้ฟังก์ชั่นมาตรฐานของ PostgreSQL คือ to_date(สตริง,'yyyy-mm-dd') ก็จะได้วันที่ที่จบการรับบริการเป็นตัวตั้ง เช่นเดียวกันกับวันเกิดของผู้ใช้บริการคือ t_patient.patient_birthday ก็ทำเหมือนกัน ทีนี้ก็เอาวันที่มารับบริการตั้ง ลบด้วย วันเกิดของผู้ใช้บริการ ก็ได้ผลต่างคืออายุ แล้ว

    แต่ผลต่างที่ได้เนี่ยยังเป็นวันอยู่ ถ้าหากว่าจะทำเป็นเดือน เราก็ต้องเอา 30 หรือ 31 ไปหารอีกต่อนึง ใช่ป่าว แต่ที่เห็นๆ มาเค้าใช้ 30 หารกัน ไม่ค่อยมีใครใช้ 31 อ่ะ ก็แปลกไปอย่าง ใครพอจะอธิบายเรื่องนี้ได้บ้างครับ ก็จะได้อายุออกมาเป็นเดือนตามที่เราต้องการ แล้วก็เอาอายุนี้ไปจัดกลุ่มตาม ค่า age_begin กับ age_end ในตาราง r_age_group นั้นแลลลลลล


ก็ลองเอา SQL ไปรันก็ได้ผลลัพท์ออกมาแบบนี้

description total
อายุ 0 ถึง 4 ปี 27
อายุ 10 ถึง 14 ปี 2
อายุ 15 ถึง 19 ปี 1
อายุ 20 ถึง 24 ปี 3
อายุ 25 ถึง 29 ปี 8
อายุ 30 ถึง 34 ปี 2
อายุ 35 ถึง 39 ปี 2
อายุ 40 ถึง 44 ปี 2
อายุ 45 ถึง 49 ปี 3
อายุ 50 ถึง 54 ปี 1
อายุ 55 ถึง 59 ปี 3
อายุ 60 ถึง 64 ปี 3
อายุ 65 ถึง 69 ปี 5
อายุ 70 ถึง 74 ปี 1
อายุ 75 ถึง 79 ปี 3

หากว่ายังไม่สะใจ อยากจะแยกเพศ ก็เพิ่มอีกสองบรรทัดนี้เข้าไประหว่าง


SELECT
r_age_group.age_description AS description
,SUM(CASE WHEN t_patient.f_sex_id='1' THEN 1 ELSE 0 END) AS male
,SUM(CASE WHEN t_patient.f_sex_id='2' THEN 1 ELSE 0 END) AS female

,COUNT(t_visit.t_visit_id) AS total

แล้วลองรัน SQL ที่เราแยกเพศดู

description male female total
อายุ 0 ถึง 4 ปี 7 20 27
อายุ 10 ถึง 14 ปี 0 2 2
อายุ 15 ถึง 19 ปี 1 0 1
อายุ 20 ถึง 24 ปี 1 2 3
อายุ 25 ถึง 29 ปี 0 8 8
อายุ 30 ถึง 34 ปี 2 0 2
อายุ 35 ถึง 39 ปี 0 2 2
อายุ 40 ถึง 44 ปี 1 1 2
อายุ 45 ถึง 49 ปี 3 0 3
อายุ 50 ถึง 54 ปี 1 0 1
อายุ 55 ถึง 59 ปี 2 1 3
อายุ 60 ถึง 64 ปี 3 0 3
อายุ 65 ถึง 69 ปี 1 4 5
อายุ 70 ถึง 74 ปี 0 1 1
อายุ 75 ถึง 79 ปี 3 0 3

แต่ผลลัพท์ที่ได้นี้ ยังไม่ค่อยสวยงามนักเนื่องจากว่าบางช่วงอายุ ที่ไม่มีผู้ใช้บริการก็ไม่แสดงออกมา คงแสดงออกมาเพียงกลุ่มอายุที่มีผู้ใช้บริการเท่านั้น ถ้าหากว่าอยากจะให้แสดงออกมาหมด ก็ต้องใช้น้องจอย (JOIN) ช่วย ลองกลับไปอ่าน เรื่องเดิมๆ แล้วจะเห็นว่า วิธีการ JOIN ทำอย่างไร

เกือบลืมไป ว่าไม่ได้เอาไฟล์ให้ดาวน์โหลดกันเยย

  1. SQL สำหรับสร้างตาราง r_age_group

  2. SQL สำหรับสร้างตาราง disease_505_code





แหล่งความรู้และอ้างอิง

วันจันทร์, ตุลาคม 10, 2548

เวบรีพอร์ต Update 9 ตุลาคม 2548

สัปดาห์ที่ผ่านมา พยายามปรับปรุงเวบรีพอร์ตอันเดิมๆ ให้มีประสิทธิภาพขึ้นกว่าเดิม เริ่มต้นด้วยรายงานผู้ป่วยเบาหวานจำแนกตามสิทธิบัตร แยกเป็นคน (ผู้ป่วยรายใหม่ในปี) ครั้ง (จำนวนที่มา visit) ในเครือข่าย นอกเครือข่าย ในเครือข่ายตามความหมายของผมคือว่า สถานบริการที่อยู่ในคัพของท่าน รวมถึง PCU ทุกแห่งด้วยนะ เช่น 1 โรงพยาบาล 4 สถานีอนามัย ถือเป็นในเครือข่ายทั้งหมด (เอามาคิดเฉพาะ hospmain นะครับ ) วิธีการของผมคือสร้างเป็นตารางฝังไว้ใน Hospital OS อีกหนึ่งตาราง รายละเอียดก็ไม่มากมายอะไร สามารถดรอปทิ้งได้เมื่อเบื่อหน่าย ก้าย เซ็ง วิธีการสร้างก็คือ เอาชื่อว่า r_service_incup แล้วกันนะครับ มีอยู่ฟิลด์เดียวแค่นั้น

CREATE TABLE service_cup
(
off_code varchar
)

แล้ววิธีการเอารหัสสถานบริการใส่คือ

INSERT INTO service_cup VALUES ('99999');

เมื่อ 99999 คือรหัสสถานพยาบาลที่อยู่ในคัพของท่านเองนะ แล้วอีกตารางหนึ่งที่ต้องเพิ่มเข้าไปคือ r_village_inpcu (รายชื่อหมู่บ้านที่อยู่ในเขตรับผิดชอบของ PCU โรงพยาบาล) มีอยู่ด้วยกัน 3 ฟิลด์ดังนี้

CREATE TABLE r_village_inpcu
(
village_code varchar,
village_name varchar,
tambon varchar(255)
)

โดยที่ village_code คือเลขหมู่บ้านคือ 1,01 2,02 ....10,11 เหตุที่ต้องมี 01,02 .... 09 ก็เพราะว่าเวลาทำบัตรอาจจะไม่ได้กรอกข้อมูลเป็น 1 อาจกรอกเป็น 01 ก็ได้ใครจะรู้ถ้าเราเอาแค่ 1 แล้วคนที่ถูกกรอกเป็น 01 ก็จะ loss ไป หรือจะเพิ่มเป็น 001,002 ..... 009 ก็ได้นะครับ ไม่ว่ากัน ส่วนเจ้า village_name คือชื่อหมู่บ้านนั่นเอง เช่น บ้านทุ่งสุนัขไม่แล บ้านดอนน้ำท่วม ๆลๆ ก็ว่ากันไป ส่วนฟิลด์สุดท้ายคือ tambon คือรหัสตำบลที่หมู่บ้านเหล่านี่ตั้งอยู่ หาได้โดยการดูที่ f_address_id จากตาราง f_address นะครับ จะมีอยู่ด้วยกัน 6 หลัก 2 หลักแรกคือรหัสจังหวัดเช่นลำพูน มีรหัสนำหน้าด้วย 51 อีกสองหลักต่อมาเป็นรหัสอำเภอ เช่นทุ่งหัวช้าง ก็เป็น 5105 สองหลักสุดท้ายคือรหัสตำบลนะครับ เช่นตำบลทุ่งหัวช้างก็จะมีรหัสเป็น 510501 วิธีการดูจากตาราง f_address คือ สมมติว่าผมอยากทราบว่า อำเภอทุ่งหัวช้างมีกี่ตำบลอะไรบ้างก็อาจจะคิวรี่ด้วย คำสั่ง

SELECT * FROM f_address WHERE address_amphur_id like '5105%' AND address_tambon_type='3'

ก็จะได้คำตอบแบบนี้

f_address_id address_description address_tambon_type address_amphur_id address_changwat_id address_region
510501 ทุ่งหัวช้าง 3 510500 510000 10
510502 บ้านปวง 3 510500 510000 10
510503 ตะเคียนปม 3 510500 510000 10


วันอาทิตย์, ตุลาคม 02, 2548

ชื่อ นามสกุล แล้วก็การสอบ Pre Test เพื่อการเข้าอบรม dot net Programmer

สุดสัปดาห์นี้ (เสาร์ อาทิตย์) มีเรื่องมากมายที่อยากเขียน
  1. เรื่องแรกคือน้ำท่วมเชียงใหม่อีกครั้ง แล้วเกี่ยวอะไรกับพ้มล่ะ อ๋อก็เกี่ยวสิ ก็วันเสาร์ที่ผ่านมา ยอดชายนายเล็ก ผ.จ.ก.ดีเอส คอมพิวเตอร์นัดผมไปเอาจอใหม่ ปรากฏว่าวันศุกร์ไอ้เราก็อุตส่าห์โทรไปคอนเฟิร์มนะว่าเอาแน่ ขอให้เตรียมของให้ด้วย ได้รับคำตอบด้วยน้ำเสียงเซ็งๆ ว่าเข้าออฟฟิซไม่ได้ค๊าบบ (ออฟฟิซของนายเล็กอยู่ในหมู่บ้านเชียงใหม่แลนด์อ่ะดิ น้ำประมาณหน้าอก) ก็เลยผลัดไปเป็นอาทิตย์หน้า แล้วกัน เพื่อนฝูง หยวนๆ กันอยู่แล้ว
  2. เลยเอารถไปเช็คซะดีกว่า ที่บริษัทสยามนิสสันเชียงใหม่ เรื่องน่าเศร้าก็คือว่าน้ำที่หม้อน้ำหายเกลี้ยงไม่เหลือหลอ ก็เปลี่ยนใหม่เกือบทั้งชุด ก็นั่งรอยาวตั้งแต่แปดโมงเช้า ถึงสี่โมงเย็น ในระหว่างที่นั่งรอก็เหลือบไปเห็นหนังสือเล่มนึงพาดหัวเกี่ยวกับ โทนี่ จา (พนม ยีรัมย์) ก็เลยสงสัยขึ้นมาว่า คุณโทนี่ เป็นคนจังหวัดบุรีรัมย์ หรือปล่าว เคยได้ยินมาว่าถ้านามสกุลลงท้ายด้วย รัมย์ แล้วล่ะก็ มาจากบุรีรัมย์ มากกว่าครึ่ง (ประวัติ วะโฮรัมย์ นักกีฬาวีลแชร์) หรือที่มาจากอำเภอด่านขุนทด ก็จะมีนามสกุลลงท้ายด้วย ..ขุนทด (คนที่เคยเล่าให้ฟังคือ น้ำหวาน ที่พ่อของเธอ มาจากอำเภอด่านขุนทด ก็นามสกุล ชันขุนทด) สรุปตามที่เคยได้ยินเลยว่า
อ่าทีนี้เริ่มคิดเลยเถิดไปเมืองนอกบ้างแล้ว เฮ่อ ๆๆ (ฟุ้งซ่านเอามากๆ) ยกตัวอย่าง เช่น
เรื่องสุดท้ายคือไปสมัครเข้ารับการอบรมเกี่ยวกับการเขียนโปรแกรม dot net ไว้แล้ววันนี้เค้าเรียกไปทำ Pre Test เพื่อวัดความรู้ (www.sipachiangmai.org กับ www.northern.co.th) การอบรมนี่ฟรีครับ เพื่อเป็นพื้นฐานในการไปสอบเซอร์ MCAD (Microsoft Certified Application Developer) ผมเองไม่ได้มีความตั้งใจจะไปสอบเซอร์กับเค้าหรอก แต่อยากเรียนเพื่อรู้เกี่ยวกับการเขียนโปรแกรมแบบ OOP ต่างหาก แต่หาคอร์สเรียนไม่ลงตัว (ที่ฟรีและใกล้บ้าน อิ อิ) และเป็นพื้นฐานในการจับกับ จาวา มากกว่า (เค้ารู้เค้าจะโกรธไหมเนี่ย) การสอบวัดความรู้ปรากฏว่าผมไม่ค่อยรู้เรื่อง เนื่องจากไม่มีพื้นของ OOP มาก่อนประกอบกับเราำไม่ได้เรียนมาทางคอมพิวเตอร์โดยตรง และข้อสอบเป็นภาษาอังกฤษทั้งหมด แต่ก็พอเดาๆ ได้ว่าข้อสอบเค้าต้องการอะไร แต่ก็ทำอะไรมากไม่ได้ นอกจาก เดา เดา ไปให้ครบ 14 ข้อ พรุ่งนี้ประกาศผลสอบแล้ว ลุ้นผมหน่อยแล้วกัน ถ้าผมโชคดีเดาถูก 55555 แต่ก็มีคนออกห้องสอบก่อนผมเยอะนะ ประมาณ 5 นาทีก็มีคนออกห้องสอบแล้ว ทำเอาผมรู้สึกว่าตัวเล็กไปถนัดใจ ไม่รู้ว่ามันง่ายเกินไปหรือปล่าว หรือมองเข้าข้างตัวเองว่า คนที่ออกก่อนน่ะ มั่วนิ่ม อารายฟะ มรึงอ่านภาษาอังกฤษ 5 กระดาษ A 4 ภายในเวลา 5 นาทีเองเหรอ (พยายามคิดเข้าข้างตัวเองมากไปมั๊ง) โจทย์ก็ออกมาประมาณว่ากำหนดค่าอะไรมาให้แล้วก็ถามว่า ถ้าต้องการดีบัก ให้แก้ไขอะไร ตรงบรรทัดไหน หรือว่า การกำหนดค่าตัวแปรของออปเจ็กค์เนี่ยกำหนดจากไหน อืมจำได้แค่นี้ ที่ตลกมากคือคนออกข้อสอบคงจะรีบมาก เลยออกข้อสอบแค่ 14 ข้อ ข้อ 7 ไม่มี แล้วข้อ 4 กับข้อ 10 ยังเป็นข้อสอบข้อเดียวกันอีกต่างหาก เออ

Powered for by Blogger Templates free hit counter code
Copyright ? 2008-2009 Uthai Lueadnakrop. All Rights reserved