Hai semuanya dan terima kasih atas bantuan Anda.
Saya memiliki situasi berikut: tabel yang disebut pernyataan yang berisi id bidang (int), stmnt_date (tanggal), debit (dua kali lipat), kredit (dua kali lipat) dan saldo (dua kali lipat)
Saya ingin menghitung saldo mengikuti aturan ini:
Saldo baris pertama ( secara kronologis ) = debit - kredit dan untuk sisa baris
saldo baris saat ini = saldo baris sebelumnya secara kronologis + debit baris saat ini - kredit baris saat ini
Seperti yang Anda lihat pada gambar di atas, baris tidak diatur berdasarkan tanggal dan itulah sebabnya saya menggunakan kata secara kronologis dua kali untuk menekankan pentingnya nilai stmnt_date.
Terima kasih banyak atas bantuan Anda.
CREATE TABLE
pernyataan dan data sampel (denganINSERT
).Jawaban:
Dengan asumsi yang
stmnt_date
memilikiUNIQUE
kendala, ini akan cukup mudah dengan fungsi jendela / analitik:Sayangnya, MySQL belum (belum) mengimplementasikan fungsi analitik. Anda dapat memecahkan masalah baik dengan SQL ketat, dengan bergabung sendiri tabel (yang seharusnya agak tidak efisien meskipun bekerja 100%) atau dengan menggunakan fitur MySQL spesifik, variabel (yang akan sangat efisien tetapi Anda harus mengujinya ketika memutakhirkan mysql, untuk memastikan bahwa hasilnya masih benar dan tidak rusak oleh beberapa peningkatan optimasi):
Dengan data Anda, itu akan menghasilkan:
sumber
Saya pikir Anda bisa mencoba yang berikut:
sumber
jawaban ypercube sangat spektakuler (saya belum pernah melihat kreasi variabel dalam satu permintaan melalui pilihan boneka seperti itu), jadi inilah pernyataan CREATE TABLE untuk kenyamanan Anda.
Untuk gambar data tabular dalam Google Image Search, Anda dapat menggunakan https://convertio.co/ocr/ atau https://ocr.space/ untuk mengubahnya menjadi dokumen teks. Kemudian jika OCR tidak mendeteksi kolom dengan benar, dan Anda memiliki Mac, gunakan TextWrangler dengan tombol pilihan ditekan untuk melakukan pemilihan persegi panjang dan memindahkan kolom di sekitar. Kombinasi dari SQL editor seperti Sequel Pro , TextWrangler dan spreadsheet seperti Google Docs membuat berurusan dengan data tabular yang dipisahkan dengan tab menjadi sangat efisien.
Jika saya bisa memasukkan semua ini ke dalam komentar yang saya mau, jadi tolong jangan mundur jawaban ini.
sumber
Bergabung sendiri tabel itu tidak terlalu cepat di meja besar. Jadi berurusan dengan tugas ini pada PostgreSQL saya memutuskan untuk menggunakan fungsi pemicu untuk menghitung "keseimbangan" bidang yang tersimpan. Semua perhitungan hanya terjadi satu kali untuk setiap baris.
sumber
Dalam, misalnya, MSSQL:
Gunakan pernyataan with () untuk menghasilkan CTE. Ini pada dasarnya adalah himpunan hasil sementara yang akan menunjukkan nilai setiap baris. Anda dapat menggunakan matematika dalam pernyataan with untuk membuat kolom di bagian akhir, menggunakan matematika untuk menunjukkan total baris adalah DEBIT-CREDIT. Dalam pernyataan with Anda, Anda harus menetapkan nomor baris untuk setiap baris, gunakan klausa OVER DENGAN () untuk memesan oleh stmnt_date.
Kemudian, secara rekursif gabung tabel ke dirinya sendiri, menggunakan a.ROWNUMBER = b.ROWNUMBER-1 atau +1 yang akan memungkinkan Anda untuk merujuk a.total + b.total = total baris ini dan baris sebelumnya.
Saya menghargai saya tidak memberikan kode namun ini adalah metode praktis untuk mencapai ini. Saya dapat memberikan kode jika diminta :)
sumber