วันอังคารที่ 16 ธันวาคม พ.ศ. 2557

รวม DB2 SQL Technique

รวม DB2 SQL Technique


  • ตรวจค่าเป็น Null
  • เลือกแสดงข้อมูลชุดแรก เช่น 10 แถวแรก
  • เพิ่ม col. RunNo หรือ Sequence
  • อ่าน BOM File
  • iSeries Navigator : เรียกใช้ CL command

ตรวจค่าเป็น Null

ปรกติใช้  ตรวจหลัง Join (ไม่พบ จะได้ค่า  Null)
ซึ่งมักจะพบกับการใช้  LEFT JOIN     (ไม่ใช่  LEFT INNER JOIN)

กรองค่าด้วย
WHERE   field1 IS NULL
WHERE   NOT   field1   IS NULL

ตรวจสอบค่า เขียนได้หลายแบบ

IFNULL(field1,0) as field1
ถ้าเปลี่ยนเป็น T-SQL ใช้  Coalesce(field1,0) as field1

หรือ เขียนแบบ"ยาว"
CASE WHEN    field1 IS NULL   THEN   0   ELSE   field1  END  AS field1

เลือกแสดงข้อมูลชุดแรก เช่น 10 แถวแรก

SELECT   field1,field2    FROM    lib.file   FETCH FIRST 10 ROWS ONLY

เพิ่ม col. RunNo หรือ Sequence

SELECT    field1,field2 ,ROW_NUMBER() OVER () as Seq    FROM  lib.file   ORDER BY field1

      field1    field2
      A         aaa
      B         bbb
      C         ccc
      D         ddd
      E         eee

เลือกแสดงข้อมูลชุดแรก เช่น 10 แถวแรก
SELECT   field1,field2    FROM    lib.file   FETCH FIRST 10 ROWS ONLY
หรือ
SELECT   * FROM
(SELECT    field1,field2 ,ROW_NUMBER() OVER () as Seq    FROM  lib.file   ORDER BY field1
) as F1
WHERE   Seq < 10

seq   field1    field2
1     A         aaa
2     B         bbb
3     C         ccc
4     D         ddd
5     E         eee

เลือกแสดง  10 ตัวถัดไป  (Top 10)
SELECT   * FROM
(SELECT    field1,field2 ,ROW_NUMBER() OVER () as Seq    FROM  lib.file   ORDER BY field1
) as F1
WHERE   Seq > 10

อ่าน BOM File

BOM ปรกติต้องสร้าง File/Field ในลักษณะนี้
Parent Child
A a1
A b1
A c1
A d1

a1 a21
a1 a22
c1 c21
c1 c22

c21 d1 (ใช้ d1 ซ้ำ)

BOM File จะต้องแสดงผลอย่างน้อย 2 แบบได้
#1 แสดงโครงสร้าง
lvl-0 lvl-1 lvl-2 lvl-3
A a1 a21
a22
b1
c1 c21 d1
c22
d1

SQL ธรรมดา  จะไม่สามารถ  แสดงแบบข้างต้นได้

#2 แสดง  การใช้วัตถุดิบ รวม (ข้อมูล Node สุดท้าย ของแต่ละโครงสร้าง)
lvl-0 รวมวัตถุดิบ
A a21
a22
b1
d1 (รวม 2 ตัว)
c22

SQL ธรรมดา  จะไม่สามารถ  แสดงผลได้

ตย. การสร้างให้ผลลัพธ์  ของสินค้า "A"  พร้อมที่จะนำไปใช้กับ  #1

WITH   RPL(level, fParent, fChild, Path) AS
  (      SELECT 1, fParent  ,fChild  ,TRIM(fParnet) || '\ ' || xChild as Path
          FROM   lib.file   AS  root
          WHERE   fParent='A'

         UNION ALL

         (   SELECT xParent.level+1, xChild.fParent, xChild.fChild
, Trim(xParent.Path) || '\ ' || xChild.fChild   as Path
              FROM  RPL  as  xParent

          INNER JOIN  
(SELECT fParent, fChild  FROM   lib.file 
                         WHERE  fParent  <>  'A'
                ) xChild
             ON xParent.fChild = xChild.fParent  
          )
  )
SELECT  fParent, level, fChild  ,Path   FROM RPL  ORDER By Path;

ผลลัพธ์
Parent Level Child Path
A 1       a1      A\a1
a1 2       a21     A\a1\a21
a21 3 a22     A\a1\a21\a22
A 1 b1      A\b1
A 1 c1      A\c1
c1      2 c21     A\c1\c21
        c21     3 d1      A\c1\c21\d1
c1      2 c22     A\c1\c22
A 1 d1      A\d1

คำอธิบาย
- ใช้  เทคนิค กำหนดตัวแปร  WITH
        RPL( .. , .. ,.. ) ตัวแปร ชนิด data set (ไม่ใช่ ค่า)
- ใช้  เทคนิค Recursive (เรียกตัวมันเอง)  RPL ถูกเรียกใช้ในตัวมันเอง
มี 2 ชุด
- ตัวแรก เฉพาะ Main Root ออกมา ต้องระบุ  ค่าที่จะค้น
- ตัวที่ 2  จะเรียกใช้  "ตัวมันเอง"
- Path ช่วยในการเรียง และเห็นภาพ

iSeries Navigator : เรียกใช้ CL command

เทคนิคนี้ Developer ที่ทำหน้าที่ Admin ด้วย  จะใช้งานบ่อยครับ
สั่ง CL Cmd แล้วให้แสดงผลลัพธ์เป็น file แล้วนำมา process ต่อ
ตย. ต้องการดู file  10 ตัวแรกใน Lib = Sarayut