Tolong pilih kategori sesuai, jenis posting (diskusi atau bukan) dan sertakan tag/topik yang sesuai seperti komputer, java, php, mysql, dll. Promosi atau posting tidak pada tempatnya akan kami hapus!
- Bagi Anda yang ingin mendaftar, baca link berikut:
http://diskusiweb.com/discussion/50491/how-to-registrasi-diskusiweb-com-baca-ini-terlebih-dahulu
- Cara menyisipkan kode program supaya tampil rapi dan terformat dengan baik di diskusiweb.com: http://www.diskusiweb.com/discussion/50415/cara-menyisipkan-kode-program-di-diskusiweb-com
- Cara posting gambar/image di post Anda: http://www.diskusiweb.com/discussion/47345/cara-menyisipkan-menyertakan-image-pada-posting/p1

[Tanya] Cara mengubah subquery-- Loading Query Lama

Saya sering menggunakan subquery sejak dulu. Namun, ternyata menggunakan hal itu membuat loading query sangat lama, apalagi bila data yang tersedia sangat banya. 
Saya bingung bagaimana mengubah subquery ini menjadi menjadi query biasa hingga loadingnya lebih cepat--ini sampai memakai waktu lebih dri 10 menit
Mohon bantuannya para master, atau mungkin ada solusi lain dari masalah saya ini?

SELECT * FROM (
                        SELECT a.kd_program AS prog,a.kd_program AS prog1,' ' AS giat,b.nm_program AS uraian, ' ' AS lokasi,' 'AS target,
                        (SELECT SUM(nilai) AS nilai FROM trdrka WHERE LEFT(kd_rek5,3)='521' AND LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program) AS bljpeg,
                        (SELECT SUM(nilai) AS nilai FROM trdrka WHERE LEFT(kd_rek5,3)='522' AND LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program) AS bljbrg,
                        (SELECT SUM(nilai) AS nilai FROM trdrka WHERE LEFT(kd_rek5,3)='523' AND LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program) AS bljmdl,
                        (SELECT SUM(nilai) AS nilai FROM trdrka WHERE  LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program) AS jumlah 
                        FROM trskpd a LEFT JOIN trdrka c ON c.kd_kegiatan=a.kd_kegiatan INNER JOIN m_prog b ON a.kd_program1=b.kd_program 
                        WHERE RIGHT(a.kd_program,2)<>'00' AND a.kd_skpd ='$id' GROUP BY a.kd_program
                        UNION 
                        SELECT a.kd_program AS prog,' ' AS prog1,a.kd_kegiatan AS giat,b.nm_kegiatan AS uraian, ' ' AS lokasi,' 'AS target,
                        (SELECT SUM(nilai) AS nilai FROM trdrka WHERE LEFT(kd_rek5,3)='521' AND kd_kegiatan = a.kd_kegiatan) AS bljpeg,
                        (SELECT SUM(nilai) AS nilai FROM trdrka WHERE LEFT(kd_rek5,3)='522'AND kd_kegiatan = a.kd_kegiatan)  AS bljbrg,
                        (SELECT SUM(nilai) AS nilai FROM trdrka WHERE LEFT(kd_rek5,3)='523'AND kd_kegiatan = a.kd_kegiatan ) AS bljmdl,
                        (SELECT SUM(nilai) AS nilai FROM trdrka WHERE kd_kegiatan = a.kd_kegiatan ) AS jumlah 
                        FROM trskpd a LEFT JOIN trdrka c ON c.kd_kegiatan=a.kd_kegiatan INNER JOIN m_giat b ON a.kd_kegiatan1=b.kd_kegiatan 
                        WHERE RIGHT(a.kd_program,2)<>'00' AND a.kd_skpd ='$id' GROUP BY a.kd_kegiatan) a ORDER BY a.prog,a.giat
Tagged:
«13

Comments

  • edited May 2014
    * hadoh * :))

    itu mah bukan cuma subquery
    tapi subquery ber subquery

    daripada puyeng baca query nyambung kaya kereta api ...

    -------------------------------------------------------------
    SELECT
      *
    FROM
    (
      SELECT
        a.kd_program AS prog,
        a.kd_program AS prog1,
        ' ' AS giat,
        b.nm_program AS uraian,
        ' ' AS lokasi,
        ' ' AS target,
        (
          SELECT
            SUM(nilai) AS nilai
          FROM
            trdrka
          WHERE
            LEFT(kd_rek5,3)='521' AND
            LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
        ) AS bljpeg,
        (
          SELECT
            SUM(nilai) AS nilai
          FROM
            trdrka
          WHERE
            LEFT(kd_rek5,3)='522' AND
            LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
        ) AS bljbrg,
        (
          SELECT
            SUM(nilai) AS nilai
          FROM
            trdrka
          WHERE
            LEFT(kd_rek5,3)='523' AND
            LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
        ) AS bljmdl,
        (
          SELECT
            SUM(nilai) AS nilai
          FROM
            trdrka
          WHERE 
            LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
        ) AS jumlah
      FROM
        trskpd a
      LEFT JOIN trdrka c ON c.kd_kegiatan=a.kd_kegiatan
      INNER JOIN m_prog b ON a.kd_program1=b.kd_program
      WHERE
        RIGHT(a.kd_program,2)<>'00' AND
        a.kd_skpd ='$id'
      GROUP BY
        a.kd_program

      UNION

      SELECT
        a.kd_program AS prog,
        ' ' AS prog1,
        a.kd_kegiatan AS giat,
        b.nm_kegiatan AS uraian,
        ' ' AS lokasi,
        ' ' AS target,
        (
          SELECT
            SUM(nilai) AS nilai
          FROM
            trdrka
          WHERE
            LEFT(kd_rek5,3)='521' AND
            kd_kegiatan = a.kd_kegiatan
        ) AS bljpeg,
        (
          SELECT
            SUM(nilai) AS nilai
          FROM
            trdrka
          WHERE
            LEFT(kd_rek5,3)='522'AND
            kd_kegiatan = a.kd_kegiatan
        ) AS bljbrg,
        (
          SELECT
            SUM(nilai) AS nilai
          FROM
            trdrka
          WHERE
            LEFT(kd_rek5,3)='523'AND
            kd_kegiatan = a.kd_kegiatan
        ) AS bljmdl,
        (
          SELECT
            SUM(nilai) AS nilai
          FROM
            trdrka
          WHERE
            kd_kegiatan = a.kd_kegiatan
        ) AS jumlah
      FROM
        trskpd a
      LEFT JOIN trdrka c ON c.kd_kegiatan=a.kd_kegiatan
      INNER JOIN m_giat b ON a.kd_kegiatan1=b.kd_kegiatan
      WHERE
        RIGHT(a.kd_program,2)<>'00' AND
        a.kd_skpd ='$id'
      GROUP BY a.kd_kegiatan
    ) a
    ORDER BY a.prog,a.giat

    -------------------------------------------------------------

    itu gw cuma copas dari query elo
    cuma gw buat supaya jelas struktur query nya
  • edited May 2014
    fokus yg ini dulu ...

    -------------------------------------------------------------
    SELECT
      a.kd_program AS prog,
      a.kd_program AS prog1,
      ' ' AS giat,
      b.nm_program AS uraian,
      ' ' AS lokasi,
      ' ' AS target,
      (
        SELECT
          SUM(nilai) AS nilai
        FROM
          trdrka
        WHERE
          LEFT(kd_rek5,3)='521' AND
          LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
      ) AS bljpeg,
      (
        SELECT
          SUM(nilai) AS nilai
        FROM
          trdrka
        WHERE
          LEFT(kd_rek5,3)='522' AND
          LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
      ) AS bljbrg,
      (
        SELECT
          SUM(nilai) AS nilai
        FROM
          trdrka
        WHERE
          LEFT(kd_rek5,3)='523' AND
          LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
      ) AS bljmdl,
      (
        SELECT
          SUM(nilai) AS nilai
        FROM
          trdrka
        WHERE 
          LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
      ) AS jumlah
    FROM
      trskpd a
    LEFT JOIN trdrka c ON c.kd_kegiatan=a.kd_kegiatan
    INNER JOIN m_prog b ON a.kd_program1=b.kd_program
    WHERE
      RIGHT(a.kd_program,2)<>'00' AND
      a.kd_skpd ='$id'
    GROUP BY
      a.kd_program
    -------------------------------------------------------------

    ganti $id dgn value yg valid
    coba elo jalankan, liat hasilnya

    lalu coba query ini :

    -------------------------------------------------------------
    SELECT
      a.kd_program AS prog,
      a.kd_program AS prog1,
      ' ' AS giat,
      b.nm_program AS uraian,
      ' ' AS lokasi,
      ' ' AS target,
      SUM(IF(LEFT(x.kd_rek5,3)='521',x.nilai,0)) AS bljpeg,
      SUM(IF(LEFT(x.kd_rek5,3)='522',x.nilai,0)) AS bljbrg,
      SUM(IF(LEFT(x.kd_rek5,3)='523',x.nilai,0)) AS bljmdl,
      SUM(x.nilai) AS jumlah
    FROM
      trskpd a
    LEFT JOIN trdrka x ON LEFT(x.kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
    LEFT JOIN trdrka c ON c.kd_kegiatan=a.kd_kegiatan
    INNER JOIN m_prog b ON a.kd_program1=b.kd_program
    WHERE
      RIGHT(a.kd_program,2)<>'00' AND
      a.kd_skpd =
    '$id'
    GROUP BY
      a.kd_program
    -------------------------------------------------------------

    hasilnya sama atau kagak ?
  • edited May 2014
    saya dari dulu terbiasa dengan subquery, trus tiba-tiba dihadapkan dengan database yang besar, ternyata saya baru tahu kalau itu mengurangi kecepatan eksekusi. 
    solusi terbaiknya harus saya ubah bagaimana query ini, bro?

    Mungkin awalnya pakai sub query yang pertama saja dulu sebagai contoh 
    *body is too long, tak bisa reply panjang-panjang rupanya.*

    edit:
    Bro Gajah udah lebih dulu ngereply
  • Hasilnya beda bro, hasil yang diperoleh lebih besar dari subquery yang asli
  • saya dari dulu terbiasa dengan subquery, trus tiba-tiba dihadapkan dengan database yang besar, ternyata saya baru tahu kalau itu mengurangi kecepatan eksekusi.
    yg lalu biar jadi masa lalu :))

    gw dari dulu juga tau kalo subquery pasti bikin lemot ...
    meskipun dicoba ditolong pake index sekalipun
    kalo reply dimari pun gw pasti selalu menyarankan : hindari subquery, kecuali kagak ada jalan lain

    tapi yg ngeyel banyak kok :D
    prinsipnya : "yg penting bisa jalan"

    satu lagi yg bikin lemot : "hindari loop query di dalam loop query"

    contoh di php :

    $sql1 = 'SELECT id FROM tbl_a';
    $res1 = mysql_query($sql1);
    while($row1=mysql_fetch_array($res1)) {
      $sql2 = 'SELECT * FROM tbl_b WHERE a_id=' . $row1['id'];
      $res2 = mysql_query($sql2);
      while($row2=mysql_fetch_array($res2)) {
        ...
        ...
      }
    }


    sama saja dgn subquery, tapi lebih parah, karena loop nya di koding
    ada transaksi berulang kali antara db server dan web server
    sementara subquery masih mendingan karena di satu engine database

    itu kalo elo beneran niat concern urusan optimasi query
  • edited May 2014
    Hasilnya beda bro, hasil yang diperoleh lebih besar dari subquery yang asli
    gw pastikan dulu yg ini :

    LEFT JOIN trdrka x ON LEFT(x.kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
    LEFT JOIN trdrka c ON c.kd_kegiatan=a.kd_kegiatan

    yg satu gw ubah dari subquery elo

    tapi itu bekerja di table rujukan yg sama "trdrka"

    yg jadi pertanyaan gw : kok kondisinya bisa beda ?

    yg satu hasil copas gw dari dalam subquery
    yg satu emang query elo sendiri
  • LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
    ----
    Yang itu saya pakai karena di tabel trdrka tidak ada field kd_program, adanya hanya kd_kegiatan, dimana kode kegiatan itu juga mencakup kode program.
    misal kd kegiatan 1123 maka kd programnya 11, digit lebihnya adalah kode kegiatan khusus.

  • Jadi kondisi
    LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
    saya gunakan untuk mencari persamaan antara kode program di trdrka dalam subquery, dengan kode program di trskpd

    LEFT JOIN trdrka c ON c.kd_kegiatan=a.kd_kegiatan
    kalau yang ini saya gunakan untuk menampilkan kode program dan nama program untuk select query utama, bang
  • edited May 2014
    query kedua itu jadi lebih sedikit karena pengaruh

    WHERE
      RIGHT(a.kd_program,2)<>'00' AND
      a.kd_skpd ='$id'

    sekarang gw tanya ...

    yg mau elo SUM() itu seharusnya
    "kd_skpd" dan "kd_program" tidak mempengaruhi nilai yg di SUM() ?
    - atau dua kondisi itu mempengaruhi nilai yg di SUM() ?

    kalo yg subquery elo, value 2 field itu tidak mempengaruhi yg di SUM()



    agak susah ngomong kalo kagak pake contoh ...

    table_a
    ref_id | cat | val
    1 | 1 | 5
    1 | 2 | 10
    2 | 1 | 15
    2 | 2 | 20

    table_b
    id | active
    1 | 1
    2 | 0

    ini hasil semodel query yg gw ubah :

    SELECT b.id,SUM(a.val) AS `val`
    FROM table_b b
    LEFT JOIN table_a a ON a.ref_id = b.id
    WHERE b.active = 1

    hasil :
    id | val
    1 | 15

    15 asalnya dari 5 + 10
    jumlah `val` yg ref_id nya = 1, karena ref_id = 1 yg active nya = 1
    WHERE mempengaruhi yg di SUM()
    WHERE juga mempengaruhi id yg ditampilkan

    ini semodel subquery elo (tapi tanpa subquery) :

    SELECT b.id,SUM(a.val) AS `val`
    FROM table_b b,table_a a
    WHERE b.active = 1

    hasil :
    id | val
    1 | 50

    50 asalnya dari 5 + 10 + 15 + 20
    jumlah seluruh `val`, kagak peduli ref_id nya, karena yg active nya = 0 juga ikut dihitung
    WHERE tidak mempengaruhi yg di SUM()
    WHERE hanya mempengaruhi id yg ditampilkan



    elo perhatikan dulu masalah elo, harusnya yg bener yg mana ...

    yg mau elo SUM() itu seharusnya
    - "kd_skpd" dan "kd_program" tidak mempengaruhi nilai yg di SUM() ?
    - atau dua kondisi itu mempengaruhi nilai yg di SUM() ?



    kalo hasil telaah masalah elo, bener hasil yg subquery ...
    coba ini :

    -------------------------------------------------------------
    SELECT
      a.kd_program AS prog,
      a.kd_program AS prog1,
      ' ' AS giat,
      b.nm_program AS uraian,
      ' ' AS lokasi,
      ' ' AS target,
      SUM(IF(LEFT(x.kd_rek5,3)='521',x.nilai,0)) AS bljpeg,
      SUM(IF(LEFT(x.kd_rek5,3)='522',x.nilai,0)) AS bljbrg,
      SUM(IF(LEFT(x.kd_rek5,3)='523',x.nilai,0)) AS bljmdl,
      SUM(x.nilai) AS jumlah
    FROM
      trskpd a
    LEFT JOIN trdrka c ON c.kd_kegiatan=a.kd_kegiatan
    INNER JOIN m_prog b ON a.kd_program1=b.kd_program,
      trdrka x
    WHERE
      LEFT(x.kd_kegiatan,LENGTH(a.kd_program))= a.kd_program AND
      RIGHT(a.kd_program,2)<>'00' AND
      a.kd_skpd ='$id'
    GROUP BY
      a.kd_program
    -------------------------------------------------------------

  • Jadi mudahnya sih begini, bang..
    misalkan dalam 1 tabel rka dengan field begini

    kd_skpd | kd_kegiatan | nm_kegiatan | rek5

    untuk subquery pertama ada 3 subquery lagi, sederhananya bila cuma untuk memanggil hasil sum-nya
    1. SELECT SUM(nilai) FROM trdrka where kd_skpd = 'A' AND LEFT(kd_rek5,3)='ABB'
    2. SELECT SUM(nilai) FROM trdrka where kd_skpd = 'A' AND LEFT(kd_rek5,3)='ABC'
    3. SELECT SUM(nilai) FROM trdrka where kd_skpd = 'A' AND LEFT(kd_rek5,3)='ACB'

    Jadi, yang mempengaruhi nilai SUM hanya kd_skpd dan kd_rek. di tabel trdrka

    kd_program hanya untuk mengambil nm_program yang ada di tabel trdskp, bang
  • edited May 2014
    lha berarti harusnya bener hasil SUM() query gw dong ? :D
    yg subquery elo SUM() nya malah salah ...

    bener kan ?

    coba elo itung manual (kerja bakti dikit)
    harusnya, hasil SUM() nya bener yg subquery ? atau SUM() query gw ?

    buat memastikan saja, jadi tau ntar yg mesti dipake query yg mana ...



    btw, itu ada 1 query lagi yg bisa elo coba
    buat menghasilkan hasil - yg gw perkirakan - sama dgn hasil subquery elo
  • Ini data yang saya pake untuk satu skpd bang

    Bila saya jalankan dengan Query
    1. SELECT SUM(nilai) FROM trdrka where kd_skpd = 'A' AND LEFT(kd_rek5,3)='521'
    2. SELECT SUM(nilai) FROM trdrka where kd_skpd = 'A' AND LEFT(kd_rek5,3)='522'
    3. SELECT SUM(nilai) FROM trdrka where kd_skpd = 'A' AND LEFT(kd_rek5,3)='522'


  • Lanjutan karena tidak bisa dibalas dalam satu post
    -----------

    Hasilnya adalah 
    1) 0
    2) 1.380.000
    3) 0

    Jika melalui Query yang bersub-sub itu hasilnya

    Prog  | prog1   | giat  | uraian  | 
    1.08.1.08.01.00.01 | 1.08.1.08.01.00.01| |Program Pelayanan Administrasi Perkantoran |

    lokasi | target |bljpeg  |bljbrg   |bjlmdl  | jumlah
    |1.380.000 | | 1.380.000

    Saya coba hitung manual untuk yang rek = 522
    70.000+500.000+60.000+50.000+100.000+600.000 = 1.380.000
    hasilnya pas bang.

    Kalau pakai Query yang abng kasih, hasil bljbrgnya
    8.280.000
  • edited May 2014
    ntar ...

    ini bahas query yg mana VS query yg mana ?

    soalnya gw sudah nunjukin 2 kemungkinan query buat ubah 1 bagian query elo (belum seluruh)
  • Oh iya...
    Ini Query yang sub query pertama. Yang abang fokuskan itu...


    kalau yang 1, 2 dan 3 itu SUM manual untuk mencari tiap rekening itu bang
  • Oh iya...
    Dua Query yang abang kasih nilainya sama... 
    sama sama dapat 8.280.000

  • edited May 2014
    coba elo export table dan data elo secukupnya
    jadi gw bisa import dan coba query nya di tempat gw

    pastekan ke pastebin
    beri waktu 1 jam saja cukup
  • Beda bang,
    Query pertama hasilnya

    Prog  | prog1   | giat  | uraian  | 
    1.08.1.08.01.00.01 | 1.08.1.08.01.00.01| - |Program Pelayanan Administrasi Perkantoran |

    lokasi | target |bljpeg  |bljbrg   |bjlmdl  | jumlah
       -   | - | 0 |1.380.000 | 0 | 1.380.000


  • Query yang bawah:
    Prog  | prog1   | giat  | uraian  | 
    1.08.1.08.01.00.01 | 1.08.1.08.01.00.01| - |Program Pelayanan Administrasi Perkantoran |

    lokasi | target |bljpeg  |bljbrg   |bjlmdl  | jumlah
       -   | - | 0 |8.280.000 | 0 | 8.280.000

    ---
    btw, kok kamu bisa ngereply panjang banget postingannya, bang?
  • edited May 2014
    coba elo export table dan data elo secukupnya
    jadi gw bisa import dan coba query nya di tempat gw

    pastekan ke pastebin
    beri waktu 1 jam saja cukup
  • export ke mana bang? 
    langsung ke excell apa langsung kayak tadi itu?
  • jangan excel dooonnggggg ...

    db gui yg elo pake apa ?
    pan ada export as SQL

    jadi gw gampang tinggal import SQL doang
    kagak perlu repot bikin table segala macem
    tinggal run query doang
  • Maaf bang agak lama..
    Ini untuk yang trdrka
    https://www.mediafire.com/?y0pitlh7sdqf6l2
    Ini untuk yang trskpd
    https://www.mediafire.com/?zi6yodoq57e8y0a

    databasenya saya kasih nama: data_server 


  • edited May 2014
    ada pemikiran yg kebalik ...

    table utama elo di kasus ini itu justru : "trdrka"
    table "trskpd" itu hanya pelengkap informasi

    dan relasi elo sebelumnya emang kagak pas kalo diterapin buat yg tanpa subquery

    -------------------------------------------------------------
    SELECT
      a.kd_program AS prog,
      a.kd_program AS prog1,
      ' ' AS giat,
      b.nm_program AS uraian,
      ' ' AS lokasi,
      ' ' AS target,
      SUM(IF(LEFT(x.kd_rek5,3)='521',x.nilai,0)) AS bljpeg,
      SUM(IF(LEFT(x.kd_rek5,3)='522',x.nilai,0)) AS bljbrg,
      SUM(IF(LEFT(x.kd_rek5,3)='523',x.nilai,0)) AS bljmdl,
      SUM(x.nilai) AS jumlah
    FROM
      trdrka x
      LEFT JOIN trskpd a ON a.kd_skpd=x.kd_skpd AND x.kd_kegiatan=a.kd_kegiatan
      INNER JOIN m_prog b ON a.kd_program1=b.kd_program
    WHERE
     
    RIGHT(a.kd_program,2)<>'00' AND
      x.kd_skpd='$id'
    GROUP BY
      a.kd_program
    -------------------------------------------------------------

    tapi ada yg mesti dipastikan dulu ...

    LEFT JOIN trdrka c ON c.kd_kegiatan=a.kd_kegiatan

    itu buat apa ?
    karena gw kagak ketemu pemilihan field atau apa pun yg merujuk ke "c"

    "kd_skpd" di "trdrka" == "kd_skpd" di "trskpd" ?
    "kd_kegiatan" di "trdrka" == "kd_kegiatan" di "trskpd" ?

    kalo 2 pertanyaan terakhir jawabnya : YA
    query di atas kayanya sudah bener
    * gw belum pasti, karena gw kagak pegang table "m_prog" *

    bandingkan hasilnya dgn yg ini :

    -------------------------------------------------------------
    SELECT
      a.kd_program AS prog,
      a.kd_program AS prog1,
      ' ' AS giat,
      b.nm_program AS uraian,
      ' ' AS lokasi,
      ' ' AS target,
      (
        SELECT
          SUM(nilai) AS nilai
        FROM
          trdrka
        WHERE
          LEFT(kd_rek5,3)='521' AND
          LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
      ) AS bljpeg,
      (
        SELECT
          SUM(nilai) AS nilai
        FROM
          trdrka
        WHERE
          LEFT(kd_rek5,3)='522' AND
          LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
      ) AS bljbrg,
      (
        SELECT
          SUM(nilai) AS nilai
        FROM
          trdrka
        WHERE
          LEFT(kd_rek5,3)='523' AND
          LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
      ) AS bljmdl,
      (
        SELECT
          SUM(nilai) AS nilai
        FROM
          trdrka
        WHERE 
          LEFT(kd_kegiatan,LENGTH(a.kd_program))= a.kd_program
      ) AS jumlah
    FROM
      trskpd a
    LEFT JOIN trdrka c ON c.kd_kegiatan=a.kd_kegiatan
    INNER JOIN m_prog b ON a.kd_program1=b.kd_program
    WHERE
      RIGHT(a.kd_program,2)<>'00' AND
      a.kd_skpd ='$id'
    GROUP BY
      a.kd_program
    -------------------------------------------------------------
  • edited May 2014
    Oke bang makasih...
    Saya coba besok, laptopnya udah mati...
    Haduh pusing, minggu depan harus ngadep dosen -_-

    Oh iya tabel m_prog-nya ketinggalan...
    Maaf bang
  • edited May 2014
    dan kalo yg di atas hasilnya sama ...

    berarti kemungkinan yg ini sama hasilnya dgn query elo keseluruhan

    -------------------------------------------------------------
    SELECT
      a.kd_program AS prog,
      a.kd_program AS prog1,
      ' ' AS giat,
      b.nm_program AS uraian,
      ' ' AS lokasi,
      ' ' AS target,
      SUM(IF(LEFT(x.kd_rek5,3)='521',x.nilai,0)) AS bljpeg,
      SUM(IF(LEFT(x.kd_rek5,3)='522',x.nilai,0)) AS bljbrg,
      SUM(IF(LEFT(x.kd_rek5,3)='523',x.nilai,0)) AS bljmdl,
      SUM(x.nilai) AS jumlah
    FROM
      trdrka x
      LEFT JOIN trskpd a ON a.kd_skpd=x.kd_skpd AND x.kd_kegiatan=a.kd_kegiatan
      INNER JOIN m_prog b ON a.kd_program1=b.kd_program
    WHERE
      RIGHT(a.kd_program,2)<>'00' AND
      x.kd_skpd=
    '$id'
    GROUP BY
      a.kd_program

    UNION

    SELECT
      a.kd_program AS prog,
      ' ' AS prog1,
      a.kd_kegiatan AS giat,
      b.nm_kegiatan AS uraian,
      ' ' AS lokasi,
      ' ' AS target,
      SUM(IF(LEFT(x.kd_rek5,3)='521',x.nilai,0)) AS bljpeg,
      SUM(IF(LEFT(x.kd_rek5,3)='522',x.nilai,0)) AS bljbrg,
      SUM(IF(LEFT(x.kd_rek5,3)='523',x.nilai,0)) AS bljmdl,
      SUM(x.nilai) AS jumlah
    FROM
      trdrka x
      LEFT JOIN trskpd a ON a.kd_skpd=x.kd_skpd AND x.kd_kegiatan=a.kd_kegiatan
      INNER JOIN m_prog b ON a.kd_program1=b.kd_program
    WHERE
      RIGHT(a.kd_program,2)<>'00' AND
      x.kd_skpd='$id'
    GROUP BY
      a.kd_kegiatan

    ORDER BY prog,giat
    -------------------------------------------------------------

    tanpa 1 pun subquery

    tinggal elo liat aja lama waktu eksekusi query nya

    kalo di tempat gw, dgn contoh isi db yg elo kirim, tanpa m_prog
    - subquery elo : 00:00:00.016
    - tanpa subquery : 00:00:00.000

    iya, cuma milidetik bedanya, tapi itu data cuma ala kadarnya
    ntah kalo ribuan
  • btw ORDER BY itu bikin lambat apa bikin cepet sih?
  • secara proses ada tambahan tahap yg mesti dilakukan

    jadi kalo pertanyaannya : "bikin lambat apa bikin cepat ?"
    pasti bikin lambat

    tapi kalo pertanyaannya : "seberapa lambat ?"
    kagak tau :D
  • Bisa bang, hasilnya sama...
    Prosesnya jauh... sangat jauh lebih cepat dari yang sub-sub query...
    bila yang pake sub query bisa sampe 600s
    yang pakai query di atas cuma butuh 8s

    Ajarin saya gimana cara mengubah subquery menjadi query tanpa sub seperti itu, bang...
    hampir semua query yang ada di modul saya menggunakan subquery, bang :((

  • edited May 2014
    ini yg susah ...
    soalnya yg bakal berlaku itu logika, pemahaman fungsi dan pemahaman alur
    yg itu dapatnya dari pengalaman semua ...

    paling tidak
    kalo model yg hasilnya mirip dgn kondisi elo di atas
    model yg gw tunjukin bisa dipake / ditiru


    kalo model nya lain ... tanya aja
    ntar gw tunjukin query penggantinya
    jadi elo bisa paham model tsb kaya apa substitusi nya



    kalo step pengubahannya, standar
    dari subquery terdalam diubah dulu jadi tanpa subquery
    baru naik ke atasnya

    elo sadar bahwa pake subquery itu kagak baik dan bikin lemot aja gw sudah senang dan bersyukur kok
    soalnya gw paling sebal liat programmer koding asal jalan, kagak peduli optimasi blas
    :D

    satu lagi yg mesti elo periksa dan hindari : loop query di dalam loop query
    itu lebih parah dari subquery
    pasti ada pengganti yg cukup pake 1 loop
  • Alur yang tadi bisa saya pahami karena subquerynya masih cukup sedikit, bang...
    Ini ada beberapa yang jauh lebih ribet dan lebih lama dari yang tadi, bang...
    Yang tadi bisa nyampe 900 detik untuk eksekusi..
    kalau yang ini bisa lebih, karena subquery yang saya pakai udah melebihi batas, bang...
    Udah di atas kewajaran...

    Ini saya melalukan Query, trus melakukan perulangan Query sampe beberapa kali dan tiap query subquerynya udah diatas batas....

    Parahnya seperti ini, bang...

    dulu waktu masih pake data percobaan lancar-lancar saja, tapi saat menggunakan data yang banyak langsung tidak berkutik, bang


  • edited May 2014
    modar ... :))

    baru juga gw tulis ...

    itu bukan lagi : loop query di dalam loop query

    tapi : loop query di dalam loop query di dalam loop query =))
    + per query nya ber sub query :))

    ntar gw liat dolo,
    inti masalah elo itu sebenernya ada dimana ...
  • edited May 2014
    Itu Query udah jalan, bang...
    masalahnya ya luama banget pas saya mengeksekusi dengan data banyak...

    Apa ada solusi untuk mengubah query itu,..?
    Kemaren-kemaren pas buat sih yang penting saya asal jadi...
    Saya pengen belajar lagi masalah Query, dari dulu sering gunakan subquery karena paling gampang dapat hasilnya, makanya saya agak minim di masalah join-join...
    tapi minggu depan kudu setor ke Dosen..

    Ajarin saya, Bang....

    Oh iya...
    1 Query saja dengan data yang lumayan banyak itu membutuhkan waktu 1.358,858 Detik, Dan eksekusi semuanya halamannya samoe gak muncul setelah setengah jam lebih menunggu 
  • edited May 2014
    gw butuh struktur dan contoh data table ini :
    "trdtransout"
    "trhtransout"
    "trhkasin_pkd"
    "trdkasin_pkd"
  • kurang 3 table lagi ...
  • edited May 2014
    sementara gw abaikan loop query di dalam loop query ...
    bahas query yg pertama dulu,

    yg ini :

    -------------------------------------------------------------
    SELECT DISTINCT 'H' AS tipe,a.kd_program AS kode2,CONCAT('<b>',a.kd_program,'</b>') AS kode,'' AS kode1, CONCAT('<b>',a.nm_program,'</b>') AS uraian,
    (SELECT SUM(nilai) FROM trdrka WHERE kd_kegiatan IN (SELECT kd_kegiatan FROM trskpd WHERE kd_program = a.kd_program)) AS anggaran,
    IFNULL((SELECT SUM(nilai) FROM (SELECT a.tgl_bukti,a.kd_skpd,a.jns_spp,b.kd_kegiatan,b.kd_rek5,b.nilai FROM trhtransout a INNER JOIN
    trdtransout b ON a.no_bukti = b.no_bukti)z WHERE z.kd_skpd = a.kd_skpd AND
    z.kd_kegiatan IN (SELECT kd_kegiatan FROM trskpd WHERE kd_program = a.kd_program)
    AND z.jns_spp IN ('1','2','3') AND MONTH(z.tgl_bukti) = '$nbulan'),0) AS real_up_ini,
    IFNULL((SELECT SUM(nilai) FROM (SELECT a.tgl_bukti,a.kd_skpd,a.jns_spp,b.kd_kegiatan,b.kd_rek5,b.nilai FROM trhtransout a INNER JOIN
    trdtransout b ON a.no_bukti = b.no_bukti)z WHERE z.kd_skpd = a.kd_skpd AND
    z.kd_kegiatan IN (SELECT kd_kegiatan FROM trskpd WHERE kd_program = a.kd_program)
    AND z.jns_spp ='4' AND MONTH(z.tgl_bukti) =
    '$nbulan'),0) -
    IFNULL((SELECT SUM(IFNULL(rupiah,0)) FROM (SELECT a.tgl_sts,a.kd_skpd,a.jns_trans,a.kd_kegiatan,b.kd_rek5,b.rupiah FROM trhkasin_pkd a INNER JOIN
    trdkasin_pkd b ON a.no_sts = b.no_sts)t WHERE t.kd_skpd = a.kd_skpd AND
    t.kd_kegiatan IN (SELECT kd_kegiatan FROM trskpd WHERE kd_program = a.kd_program) AND t.jns_trans = '51' AND MONTH(t.tgl_sts) =
    '$nbulan')
    ,0)AS real_gaji_ini,
    IFNULL((SELECT SUM(nilai) FROM (SELECT a.tgl_bukti,a.kd_skpd,a.jns_spp,b.kd_kegiatan,b.kd_rek5,b.nilai FROM trhtransout a INNER JOIN
    trdtransout b ON a.no_bukti = b.no_bukti)z WHERE z.kd_skpd = a.kd_skpd AND
    z.kd_kegiatan IN (SELECT kd_kegiatan FROM trskpd WHERE kd_program = a.kd_program)
    AND z.jns_spp IN('6','5') AND MONTH(z.tgl_bukti) =
    '$nbulan'),0) -
    IFNULL((SELECT SUM(IFNULL(rupiah,0)) FROM (SELECT a.tgl_sts,a.kd_skpd,a.jns_trans,a.kd_kegiatan,b.kd_rek5,b.rupiah FROM trhkasin_pkd a INNER JOIN
    trdkasin_pkd b ON a.no_sts = b.no_sts)t WHERE t.kd_skpd = a.kd_skpd AND
    t.kd_kegiatan IN (SELECT kd_kegiatan FROM trskpd WHERE kd_program = a.kd_program) AND t.jns_trans = '52' AND MONTH(t.tgl_sts) =
    '$nbulan')
    ,0)AS real_brg_js_ini,
    IFNULL((SELECT SUM(nilai) FROM (SELECT a.tgl_bukti,a.kd_skpd,a.jns_spp,b.kd_kegiatan,b.kd_rek5,b.nilai FROM trhtransout a INNER JOIN
    trdtransout b ON a.no_bukti = b.no_bukti)z WHERE z.kd_skpd = a.kd_skpd AND
    z.kd_kegiatan IN (SELECT kd_kegiatan FROM trskpd WHERE kd_program = a.kd_program)
    AND z.jns_spp IN ('1','2','3') AND MONTH(z.tgl_bukti) <
    '$nbulan'),0) AS real_up_ll,
    IFNULL((SELECT SUM(nilai) FROM (SELECT a.tgl_bukti,a.kd_skpd,a.jns_spp,b.kd_kegiatan,b.kd_rek5,b.nilai FROM trhtransout a INNER JOIN
    trdtransout b ON a.no_bukti = b.no_bukti)z WHERE z.kd_skpd = a.kd_skpd AND
    z.kd_kegiatan IN (SELECT kd_kegiatan FROM trskpd WHERE kd_program = a.kd_program)
    AND z.jns_spp ='4' AND MONTH(z.tgl_bukti) <
    '$nbulan'),0) -
    IFNULL((SELECT SUM(IFNULL(rupiah,0)) FROM (SELECT a.tgl_sts,a.kd_skpd,a.jns_trans,a.kd_kegiatan,b.kd_rek5,b.rupiah FROM trhkasin_pkd a INNER JOIN
    trdkasin_pkd b ON a.no_sts = b.no_sts)t WHERE t.kd_skpd = a.kd_skpd AND
    t.kd_kegiatan IN (SELECT kd_kegiatan FROM trskpd WHERE kd_program = a.kd_program) AND t.jns_trans = '51' AND MONTH(t.tgl_sts) <
    '$nbulan')
    ,0)AS real_gaji_ll,
    IFNULL((SELECT SUM(nilai) FROM (SELECT a.tgl_bukti,a.kd_skpd,a.jns_spp,b.kd_kegiatan,b.kd_rek5,b.nilai FROM trhtransout a INNER JOIN
    trdtransout b ON a.no_bukti = b.no_bukti)z WHERE z.kd_skpd = a.kd_skpd AND
    z.kd_kegiatan IN (SELECT kd_kegiatan FROM trskpd WHERE kd_program = a.kd_program)
    AND z.jns_spp IN('6','5') AND MONTH(z.tgl_bukti) <
    '$nbulan'),0) -
    IFNULL((SELECT SUM(IFNULL(rupiah,0)) FROM (SELECT a.tgl_sts,a.kd_skpd,a.jns_trans,a.kd_kegiatan,b.kd_rek5,b.rupiah FROM trhkasin_pkd a INNER JOIN
    trdkasin_pkd b ON a.no_sts = b.no_sts)t WHERE t.kd_skpd = a.kd_skpd AND
    t.kd_kegiatan IN (SELECT kd_kegiatan FROM trskpd WHERE kd_program = a.kd_program) AND t.jns_trans = '52' AND MONTH(t.tgl_sts) <
    '$nbulan')
     ,0)AS real_brg_js_ll
    FROM trskpd a WHERE a.kd_skpd = '$lcskpd'
    -------------------------------------------------------------

  • edited May 2014
    kayanya emang kagak bisa menghindari sub query
    soalnya gw liat ada 3 bentuk table yg jadi table dasar
    tapi sub query nya jauh lebih baik dibanding punya elo

    gw langsung saja tulis semua, soalnya males bahas 1-1

    elo bandingkan hasil 2 query nya, sama atau kagak ...
    baru ntar lanjut ke query berikut

    -------------------------------------------------------------
    SELECT
      tipe,kode2,kode,kode1,uraian,anggaran,
      SUM(IF(t2.jns_spp IN ('1','2','3'),t2.eq,0)) AS real_up_ini,
      SUM(IF(t2.jns_spp IN ('4'),t2.eq,0))-SUM(IF(t3.jns_trans='51',t3.eq,0)) AS real_gaji_ini,
      SUM(IF(t2.jns_spp IN ('6','5'),t2.eq,0))-SUM(IF(t3.jns_trans='52',t3.eq,0)) AS real_brg_js_ini,
      SUM(IF(t2.jns_spp IN ('1','2','3'),t2.lt,0)) AS real_up_ll,
      SUM(IF(t2.jns_spp IN ('4'),t2.lt,0))-SUM(IF(t3.jns_trans='51',t3.lt,0)) AS real_gaji_ll,
      SUM(IF(t2.jns_spp IN ('6','5'),t2.lt,0))-SUM(IF(t3.jns_trans='52',t3.lt,0)) AS real_brg_js_ll
    FROM
    (
      SELECT
        DISTINCT 'H' AS tipe,
        a.kd_program AS kode2,
        CONCAT('<b>',a.kd_program,'</b>') AS kode,
        '' AS kode1,
        CONCAT('<b>',a.nm_program,'</b>') AS uraian,
        SUM(IF(x.kd_kegiatan=a.kd_kegiatan,x.nilai,0)) AS anggaran,
        x.kd_skpd,
        x.kd_kegiatan,
        a.kd_program
      FROM
        trdrka `x`
      LEFT JOIN trskpd a ON a.kd_skpd=x.kd_skpd AND x.kd_kegiatan=a.kd_kegiatan
      WHERE x.kd_skpd = '$lcskpd'
      GROUP BY a.kd_program
    ) t1
    LEFT JOIN (
      SELECT
        n.kd_skpd,m.kd_kegiatan,n.jns_spp,
        SUM(IF(MONTH(n.tgl_bukti)='$nbulan',m.nilai,0)) AS eq,
        SUM(IF(MONTH(n.tgl_bukti)<
    '$nbulan',m.nilai,0)) AS lt
      FROM trhtransout n
      LEFT JOIN trdtransout m ON n.no_bukti = m.no_bukti
      GROUP BY m.kd_kegiatan
    ) t2 ON t2.kd_skpd=t1.kd_skpd AND t2.kd_kegiatan=t1.kd_kegiatan
    LEFT JOIN (
      SELECT
        o.kd_skpd,p.kd_kegiatan,o.jns_trans,
        SUM(IF(MONTH(o.tgl_sts)=
    '$nbulan',p.rupiah,0)) AS eq,
        SUM(IF(MONTH(o.tgl_sts)<
    '$nbulan',p.rupiah,0)) AS lt
      FROM trhkasin_pkd o
      LEFT JOIN trdkasin_pkd p ON o.no_sts = p.no_sts
      GROUP BY p.kd_kegiatan
    ) t3 ON t3.kd_skpd=t1.kd_skpd AND t3.kd_kegiatan=t1.kd_kegiatan

    GROUP BY t1.kd_program
    -------------------------------------------------------------


    gw test dgn data yg ada di tempat gw ...
    subquery cara gw : 00:00:00.000
    subquery cara elo : 00:00:00.219
  • edited May 2014
    Maaf bang, lama...

    Sudah jalan sih, cuma pas bagian "real_gaji_ini" hasilnya jadi 0
    padahal kalau query yang awal ada nilainya, bang...
    ----a
    real_up_ini  dan real_gaji_II 
    hasilnya juga 0 bang
    ---

    saya coba pake SKPD: 1.02.01.00 trus bulannya 1,  dan 2
  • edited May 2014
    ow,
    jumlahnya berdasar GROUP BY kd_program ...

    tinggal ubah dikit

    -------------------------------------------------------------
    SELECT
      tipe,
      t1.kd_program AS kode2,
      CONCAT('<b>',t1.kd_program,'</b>') AS kode,
      kode1,
      uraian,
      anggaran,
      SUM(IF(t2.jns_spp IN ('1','2','3'),t2.eq,0)) AS real_up_ini,
      SUM(IF(t2.jns_spp IN ('4'),t2.eq,0))-SUM(IF(t3.jns_trans='51',t3.eq,0)) AS real_gaji_ini,
      SUM(IF(t2.jns_spp IN ('6','5'),t2.eq,0))-SUM(IF(t3.jns_trans='52',t3.eq,0)) AS real_brg_js_ini,
      SUM(IF(t2.jns_spp IN ('1','2','3'),t2.lt,0)) AS real_up_ll,
      SUM(IF(t2.jns_spp IN ('4'),t2.lt,0))-SUM(IF(t3.jns_trans='51',t3.lt,0)) AS real_gaji_ll,
      SUM(IF(t2.jns_spp IN ('6','5'),t2.lt,0))-SUM(IF(t3.jns_trans='52',t3.lt,0)) AS real_brg_js_ll
    FROM
    (
      SELECT
        DISTINCT 'H' AS tipe,
        '' AS kode1,
        CONCAT('<b>',a.nm_program,'</b>') AS uraian,
        SUM(IF(x.kd_kegiatan=a.kd_kegiatan,x.nilai,0)) AS anggaran,
        x.kd_skpd,
        a.kd_program
      FROM
        trdrka `x`
      LEFT JOIN trskpd a ON a.kd_skpd=x.kd_skpd AND x.kd_kegiatan=a.kd_kegiatan
      WHERE x.kd_skpd =
    '$lcskpd'
      GROUP BY a.kd_program
    ) t1
    LEFT JOIN (
      SELECT
        SUBSTRING_INDEX(m.kd_kegiatan,".",7) AS kd_program,
        n.kd_skpd,n.jns_spp,
        SUM(IF(MONTH(n.tgl_bukti)='$nbulan',m.nilai,0)) AS eq,
        SUM(IF(MONTH(n.tgl_bukti)<'$nbulan',m.nilai,0)) AS lt
      FROM trhtransout n
      LEFT JOIN trdtransout m ON n.no_bukti = m.no_bukti
      GROUP BY kd_program
    ) t2 ON t2.kd_skpd=t1.kd_skpd AND t2.kd_program=t1.kd_program
    LEFT JOIN (
      SELECT
        SUBSTRING_INDEX(p.kd_kegiatan,".",7) AS kd_program,
        o.kd_skpd,o.jns_trans,
        SUM(IF(MONTH(o.tgl_sts)='$nbulan',p.rupiah,0)) AS eq,
        SUM(IF(MONTH(o.tgl_sts)<'$nbulan',p.rupiah,0)) AS lt
      FROM trhkasin_pkd o
      LEFT JOIN trdkasin_pkd p ON o.no_sts = p.no_sts
      GROUP BY kd_program
    ) t3 ON t3.kd_skpd=t1.kd_skpd AND t3.kd_program=t1.kd_program

    GROUP BY t1.kd_program
    -------------------------------------------------------------
  • Udah bener yang terakhir ini, bang. ini harus ngeloop dua kali juga ya bang?
    Bang ajarin saya, bang.... T.T
  • edited May 2014
    nge-loop 2x gimana maksudnya ?

    yg di atas baru utk menggantikan query pertama dari 3 query yg ada di koding elo ...

    dan gw sudah ngeliat query yg kedua
    gw paham maksud elo

    kalo gw,
    query pertama dan kedua elo bisa digabung
    jadi bukan loop query di dalam loop query
    cukup 1 loop query doang

    baca dulu ini :
    http://www.diskusiweb.com/discussion/comment/263826#Comment_263826
    http://www.diskusiweb.com/discussion/comment/263866#Comment_263866

    itu utk membentuk tampilannya
    contoh sederhana banget,
    cuma tampilan antara parent dan child dalam table
    tapi alur yg sama seperti itu yg bisa elo pake buat merubah loop query di dalam loop query elo jadi cuma 1x loop



    tapi sementara, biarin dulu aja dah pake alur elo
    yg penting ganti query nya dulu buat menghindari subquery yg berat

    btw, waktu query nya turun atau kagak ?
    seberapa jauh bedanya ?
  • Bentar... saya masih mengawang-ngawang, bang....

    Udah lumayan berubah, lebih cepat dari sebelumnya, tentu saja...
  • lanjut query kedua ...
    kagak beda dgn yg pertama
    malah serupa, cuma ubah dikit banget ...

    -------------------------------------------------------------
    SELECT 'H' AS tipe,a.kd_kegiatan AS kode2,CONCAT('<b>',a.kd_kegiatan,'</b>') AS kode,'' AS kode1 ,CONCAT('<b>',a.nm_kegiatan,'</b>') AS uraian,
    (SELECT SUM(nilai) FROM trdrka WHERE kd_kegiatan = a.kd_kegiatan) AS anggaran,
    IFNULL((SELECT SUM(nilai) FROM (SELECT a.tgl_bukti,a.kd_skpd,a.jns_spp,b.kd_kegiatan,b.kd_rek5,b.nilai FROM trhtransout a INNER JOIN
    trdtransout b ON a.no_bukti = b.no_bukti)z WHERE z.kd_skpd = a.kd_skpd AND
    z.kd_kegiatan = a.kd_kegiatan AND z.jns_spp IN ('1','2','3') AND MONTH(z.tgl_bukti) = '$nbulan'),0) AS real_up_ini,
    IFNULL((SELECT SUM(nilai) FROM (SELECT a.tgl_bukti,a.kd_skpd,a.jns_spp,b.kd_kegiatan,b.kd_rek5,b.nilai FROM trhtransout a INNER JOIN
    trdtransout b ON a.no_bukti = b.no_bukti)z WHERE z.kd_skpd = a.kd_skpd AND
    z.kd_kegiatan = a.kd_kegiatan AND z.jns_spp ='4' AND MONTH(z.tgl_bukti) =
    '$nbulan'),0) -
    IFNULL((SELECT SUM(IFNULL(rupiah,0)) FROM (SELECT a.tgl_sts,a.kd_skpd,a.jns_trans,a.kd_kegiatan,b.kd_rek5,b.rupiah FROM trhkasin_pkd a INNER JOIN
    trdkasin_pkd b ON a.no_sts = b.no_sts)t WHERE t.kd_skpd = a.kd_skpd AND
    t.kd_kegiatan IN (SELECT kd_kegiatan FROM trskpd WHERE kd_program = a.kd_program) AND t.jns_trans = '51' AND MONTH(t.tgl_sts) =
    '$nbulan')
    ,0) AS real_gaji_ini,
    IFNULL((SELECT SUM(nilai) FROM (SELECT a.tgl_bukti,a.kd_skpd,a.jns_spp,b.kd_kegiatan,b.kd_rek5,b.nilai FROM trhtransout a INNER JOIN
    trdtransout b ON a.no_bukti = b.no_bukti)z WHERE z.kd_skpd = a.kd_skpd AND
    z.kd_kegiatan = a.kd_kegiatan AND z.jns_spp IN('6','5') AND MONTH(z.tgl_bukti) =
    '$nbulan'),0)-
    IFNULL((SELECT SUM(IFNULL(rupiah,0)) FROM (SELECT a.tgl_sts,a.kd_skpd,a.jns_trans,a.kd_kegiatan,b.kd_rek5,b.rupiah FROM trhkasin_pkd a INNER JOIN
    trdkasin_pkd b ON a.no_sts = b.no_sts)t WHERE t.kd_skpd = a.kd_skpd AND
    t.kd_kegiatan IN (SELECT kd_kegiatan FROM trskpd WHERE kd_program = a.kd_program) AND t.jns_trans = '52' AND MONTH(t.tgl_sts) =
    '$nbulan')
    ,0) AS real_brg_js_ini,
    IFNULL((SELECT SUM(nilai) FROM (SELECT a.tgl_bukti,a.kd_skpd,a.jns_spp,b.kd_kegiatan,b.kd_rek5,b.nilai FROM trhtransout a INNER JOIN
    trdtransout b ON a.no_bukti = b.no_bukti)z WHERE z.kd_skpd = a.kd_skpd AND
    z.kd_kegiatan = a.kd_kegiatan AND z.jns_spp IN ('1','2','3') AND MONTH(z.tgl_bukti) <
    '$nbulan'),0) AS real_up_ll,
    IFNULL((SELECT SUM(nilai) FROM (SELECT a.tgl_bukti,a.kd_skpd,a.jns_spp,b.kd_kegiatan,b.kd_rek5,b.nilai FROM trhtransout a INNER JOIN
    trdtransout b ON a.no_bukti = b.no_bukti)z WHERE z.kd_skpd = a.kd_skpd AND
    z.kd_kegiatan = a.kd_kegiatan AND z.jns_spp ='4' AND MONTH(z.tgl_bukti) <
    '$nbulan'),0) -
    IFNULL((SELECT SUM(IFNULL(rupiah,0)) FROM (SELECT a.tgl_sts,a.kd_skpd,a.jns_trans,a.kd_kegiatan,b.kd_rek5,b.rupiah FROM trhkasin_pkd a INNER JOIN
    trdkasin_pkd b ON a.no_sts = b.no_sts)t WHERE t.kd_skpd = a.kd_skpd AND
    t.kd_kegiatan IN (SELECT kd_kegiatan FROM trskpd WHERE kd_program = a.kd_program) AND t.jns_trans = '51' AND MONTH(t.tgl_sts) <
    '$nbulan')
    ,0) AS real_gaji_ll,
    IFNULL((SELECT SUM(nilai) FROM (SELECT a.tgl_bukti,a.kd_skpd,a.jns_spp,b.kd_kegiatan,b.kd_rek5,b.nilai FROM trhtransout a INNER JOIN
    trdtransout b ON a.no_bukti = b.no_bukti)z WHERE z.kd_skpd = a.kd_skpd AND
    z.kd_kegiatan = a.kd_kegiatan AND z.jns_spp IN('6','5') AND MONTH(z.tgl_bukti) <
    '$nbulan'),0) -
    IFNULL((SELECT SUM(IFNULL(rupiah,0)) FROM (SELECT a.tgl_sts,a.kd_skpd,a.jns_trans,a.kd_kegiatan,b.kd_rek5,b.rupiah FROM trhkasin_pkd a INNER JOIN
    trdkasin_pkd b ON a.no_sts = b.no_sts)t WHERE t.kd_skpd = a.kd_skpd AND
    t.kd_kegiatan IN (SELECT kd_kegiatan FROM trskpd WHERE kd_program = a.kd_program) AND t.jns_trans = '52' AND MONTH(t.tgl_sts) <
    '$nbulan'),
    0) AS real_brg_js_ll
    FROM trskpd a WHERE a.kd_skpd = '$lcskpd' AND a.kd_program = '$lcprogram' AND a.jns_kegiatan <>'4'
    -------------------------------------------------------------

  • edited May 2014
    ini ubahannya ...

    -------------------------------------------------------------
    SELECT
      tipe,
      t1.kd_kegiatan AS kode2,
      CONCAT('<b>',t1.kd_kegiatan,'</b>') AS kode,
      kode1,
      uraian,
      anggaran,
      SUM(IF(t2.jns_spp IN ('1','2','3'),t2.eq,0)) AS real_up_ini,
      SUM(IF(t2.jns_spp IN ('4'),t2.eq,0))-SUM(IF(t3.jns_trans='51',t3.eq,0)) AS real_gaji_ini,
      SUM(IF(t2.jns_spp IN ('6','5'),t2.eq,0))-SUM(IF(t3.jns_trans='52',t3.eq,0)) AS real_brg_js_ini,
      SUM(IF(t2.jns_spp IN ('1','2','3'),t2.lt,0)) AS real_up_ll,
      SUM(IF(t2.jns_spp IN ('4'),t2.lt,0))-SUM(IF(t3.jns_trans='51',t3.lt,0)) AS real_gaji_ll,
      SUM(IF(t2.jns_spp IN ('6','5'),t2.lt,0))-SUM(IF(t3.jns_trans='52',t3.lt,0)) AS real_brg_js_ll
    FROM
    (
      SELECT
        DISTINCT 'H' AS tipe,
        '' AS kode1,
        CONCAT('<b>',a.nm_kegiatan,'</b>') AS uraian,
        SUM(IF(x.kd_kegiatan=a.kd_kegiatan,x.nilai,0)) AS anggaran,
        x.kd_skpd,
        a.kd_kegiatan
      FROM
        trdrka `x`
      LEFT JOIN trskpd a ON a.kd_skpd=x.kd_skpd AND x.kd_kegiatan=a.kd_kegiatan
      WHERE
        x.kd_skpd = '$lcskpd' AND
        a.kd_program = '$lcprogram' AND
        a.jns_kegiatan<>'4'
      GROUP BY a.kd_kegiatan
    ) t1
    LEFT JOIN (
      SELECT
        m.kd_kegiatan,
        n.kd_skpd,n.jns_spp,
        SUM(IF(MONTH(n.tgl_bukti)=
    '$nbulan',m.nilai,0)) AS eq,
        SUM(IF(MONTH(n.tgl_bukti)<'$nbulan',m.nilai,0)) AS lt
      FROM trhtransout n
      LEFT JOIN trdtransout m ON n.no_bukti = m.no_bukti
      GROUP BY kd_kegiatan
    ) t2 ON t2.kd_skpd=t1.kd_skpd AND t2.kd_kegiatan=t1.kd_kegiatan
    LEFT JOIN (
      SELECT
        p.kd_kegiatan,
        o.kd_skpd,o.jns_trans,
        SUM(IF(MONTH(o.tgl_sts)='$nbulan',p.rupiah,0)) AS eq,
        SUM(IF(MONTH(o.tgl_sts)<'$nbulan',p.rupiah,0)) AS lt
      FROM trhkasin_pkd o
      LEFT JOIN trdkasin_pkd p ON o.no_sts = p.no_sts
      GROUP BY kd_kegiatan
    ) t3 ON t3.kd_skpd=t1.kd_skpd AND t3.kd_kegiatan=t1.kd_kegiatan

    GROUP BY t1.kd_kegiatan
    -------------------------------------------------------------
  • Bang, saya masih pusing gimana cara ngubahnya....
    saya pelajari dari tadi masih belum nyantol juga gimana ngubah Querynya....

    yang kedua udah bisa, juga... jadi semakin cepat. Tapi saya belum coba di data yang cukup banyak.. 
  • edited May 2014
    maksudnya masukin ke koding nya ?

    pan tinggal di copas doang ...
    koding elo yg ini : http://pastebin.com/kPSc5H96
    replace query yg lama, pake query yg baru

    alur, sementara biarkan saja apa adanya
    cuma ganti query doang



    kalo yg elo maksud :
    cara mengubah query yg bersubquery jadi query yg lebih baik ...

    pan gw sudah bilang :
    "...
    ini yg susah ...
    soalnya yg bakal berlaku itu logika, pemahaman fungsi dan pemahaman alur
    yg itu dapatnya dari pengalaman semua ...
    ..."

    gw kagak bisa bikin orang supaya paham
    paham itu elo sendiri yg melakukan

    sementara, copas saja dulu
    sembari elo pelajari
    - kenapa bentuk subquery nya kaya begitu
    - hasil subquery tsb apa
    - kenapa antar subquery di relasikan spt itu
    - lalu dari relasi tsb, field mana aja yg harus diambil sebagai hasil

    gw kagak bisa membuat elo paham
    pengalaman elo sendiri yg nantinya bakal mengajari elo supaya paham dan mengerti logikanya
    dan mungkin nantinya dari pemahaman elo justru bisa menghasilkan query yg lebih baik lagi dari yg gw tulis

    kalo bisa gw ajarkan, pasti gw ajarkan mas ... :D ... sumpe dweehhh ...
    daripada gw ribet-ribet bikinin query buat elo ...
  • Iya, yang saya maksud ngubah qury dari yang bersub-sub jadi lancar seperti ini..
    Kalau seperti kasus yang kemaren saya udah rada ngerti, saya udah berhasil ngubah beberapa Query yang yang bersub, menjadi Query biasa kayak kemaren..
    yang ini levelnya beda jauh dari yang kemaren... :-((
  • edited May 2014
    emang, yg ini agak lebih ribet
    lha wong gw juga bilang : kagak bisa menghindari subquery

    makanya ... pelan-pelan aja ...
    kagak usah buru-buru ...

    ntar aja kalo sudah senggang ...
    kepala sudah adem
    kagak butek lagi
    baca ulang
    sedikit demi sedikit dipahami

    kalo pikiran masih butek, elo paksa kaya apa ... ya jadinya tambah mumet :D

    sementara, copas saja dulu ...
Sign In or Register to comment.