Cześć wszystkim i dziękuję za pomoc.
Mam następującą sytuację: tabela zwana wyciągami zawierająca pola id (int), stmnt_date (data), debet (podwójne), kredyt (podwójne) i saldo (podwójne)
Chcę obliczyć saldo zgodnie z następującymi zasadami:
Saldo pierwszego rzędu ( chronologicznie ) = debet - kredyt i dla pozostałych rzędów
bieżące saldo wiersza = chronologicznie poprzednie saldo wiersza + bieżące obciążenie wiersza - bieżące saldo wiersza
Jak widać na powyższym obrazku, wiersze nie są ułożone według daty i dlatego dwukrotnie użyłem tego słowa chronologicznie, aby podkreślić znaczenie wartości stmnt_date.
Bardzo ci dziękuje za pomoc.
CREATE TABLE
wyciągi i przykładowe dane (zINSERT
).Odpowiedzi:
Zakładając, że
stmnt_date
ma toUNIQUE
ograniczenie, byłoby to dość łatwe dzięki funkcjom okna / analizy:Niestety MySQL nie (jeszcze) zaimplementował funkcji analitycznych. Możesz rozwiązać problem albo za pomocą ścisłego SQL, przez samodzielne dołączenie do tabeli (która powinna być raczej nieefektywna, chociaż działa w 100%) lub przez użycie określonej funkcji MySQL, zmiennych (które byłyby dość wydajne, ale trzeba by to przetestować podczas uaktualniania mysql, aby upewnić się, że wyniki są nadal poprawne i nie są zniekształcone przez pewne ulepszenia optymalizacji):
Twoje dane spowodują:
źródło
Myślę, że możesz spróbować:
źródło
Odpowiedź ypercube jest dość spektakularna (nigdy nie widziałem tworzenia zmiennej w jednym zapytaniu za pomocą takiego fikcyjnego wyboru), więc oto instrukcja CREATE TABLE dla twojej wygody.
W przypadku obrazów danych tabelarycznych w Wyszukiwarce grafiki Google możesz użyć https://convertio.co/ocr/ lub https://ocr.space/, aby przekonwertować go na dokument tekstowy. Następnie, jeśli OCR nie wykrył kolumn poprawnie, a masz komputer Mac, użyj TextWrangler z wciśniętym klawiszem opcji, aby wykonać prostokątny wybór i przesuwać kolumny. Połączenie edytora SQL, takiego jak Sequel Pro , TextWrangler i arkusza kalkulacyjnego, takiego jak Dokumenty Google, sprawia, że radzenie sobie z danymi tabelarycznymi oddzielonymi tabulatorami jest niezwykle wydajne.
Gdybym mógł umieścić to wszystko w komentarzu, zrobiłbym to, więc proszę nie głosować za odpowiedzią.
źródło
Stoły do samodzielnego łączenia nie są bardzo szybkie na dużych stołach. Dlatego radząc sobie z tym zadaniem na PostgreSQL postanowiłem użyć funkcji wyzwalacza do obliczenia przechowywanego pola „balance”. Wszystkie obliczenia odbywają się tylko raz dla każdego wiersza.
źródło
Na przykład w MSSQL:
Użyj instrukcji with (), aby wygenerować CTE. Jest to zasadniczo tymczasowy zestaw wyników, który pokaże wartość każdego wiersza. Możesz użyć matematyki w instrukcji with, aby utworzyć kolumnę na końcu, używając matematyki, aby pokazać sumę wiersza to DEBIT-KREDYT. W instrukcji with musisz przypisać numery wierszy do każdego wiersza, użyj klauzuli OVER z WITH (), aby uporządkować do stmnt_date.
Następnie rekurencyjnie połącz tabelę z sobą, używając a.ROWNUMBER = b.ROWNUMBER-1 lub +1, co pozwoli ci odwołać się do a.total + b.total = suma tego i poprzedniego wiersza.
Rozumiem, że nie dostarczam kodu, ale jest to praktyczna metoda na osiągnięcie tego. Na żądanie mogę podać kod :)
źródło