SQL для выписки счетов - PullRequest
       4

SQL для выписки счетов

1 голос
/ 16 августа 2011

Я хотел бы заранее поблагодарить за любую помощь.

Моя проблема связана с двумя таблицами в MySQL (теперь переключается на postgresql ) .Таблицы связаны с базой данных билетов.

a) booking. It has four columns       ccode,date,time,amount
b) account  It has three columns      ccode,date,amount

В таблице бронирования есть заказы билетов, а в таблице счетов - авансы и полученные платежи.

Я должен подготовитьвыписка по счету на основе ccode (код клиента).

В выписке указаны следующие столбцы:

*Ccode    Type    Date     time    amount    balance*

- the report in sorted on ccode and then on date (account table row appears first)
- Type column displays B or A depending on record type
- Time column is present only in booking table
- Report has a running balance for each row 
- At the end for a customercode, the totals of amount and balance is displayed

Я добился успеха в создании соединения, так какниже.(и после обсуждения ниже, удалось сгенерировать столбец TYPE, используя IF)

SELECT     booking.cname, booking.bdate, booking.btime, booking.rate, booking.ID,
           IF(booking.btime IS NOT NULL, "B", "A") AS type, account.cname, account.date,
           account.amount, account.ID 
FROM       booking 
LEFT JOIN  account ON booking.bdate = account.date AND booking.cname=account.cname AND 
           booking.rate = account.amount  
UNION 
SELECT     booking.cname, booking.bdate, booking.btime, booking.rate, booking.ID, 
           IF(booking.btime IS NOT NULL, "B", "A") AS type, account.cname, account.date,
           account.amount, account.ID  
FROM       booking 
RIGHT JOIN account ON booking.bdate = account.date AND booking.cname=account.cname AND 
           booking.rate = account.amount

Отображает все записи.Отчет может быть создан с использованием этой таблицы.

Но есть ли способ отобразить отформатированный отчет только с помощью SQL. Я могу изменить порядок столбцов и даже добавлять или удалять существующие, если известен тип записи и для каждой записи отображается текущий баланс.

ОБРАЗЕЦ ОТЧЕТА ---- ОТЧЕТ A

CODE          DATE           TYPE              AMOUNT            BALANCE    TIME

A1           02/19/2011       A                 50               50        
A1           02/20/2011       B                 35               15          1230
A1           02/21/2011       A                 40               55
A1           02/21/2011       B                 20               35          1830


optional > TOTAL Account = 90    Booking = 55    Balance = 35 

ОБРАЗЕЦ ОТЧЕТА ---- ОТЧЕТ B

CODE          AMOUNT BOOKED             AMOUNT PAID           BALANCE

A1                      50               50                     0
A1                      35               15                     20
A1                      40               55                    -15
A1                      20               35                    -15

this is a weekly statement version of REPORT A. 
the reason is i can add where and between to get only records in a given week. 
and since it is a weekly report, running balance is just omitted. 
It is report grouped for all entries with customercode A1 present 
   in booking and account tables.

thanx

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Поскольку ваши данные не нормализованы для этого, вы платите цену сложностью запроса, как показано ниже:

SELECT    ccode, date, time, type, amount, 
          (SELECT SUM(amount) AS balance 
          FROM numbered AS n 
          WHERE numbered.rownum <= n.rownum AND numbered.ccode = n.ccode) AS balance 
FROM      (SELECT sorted.*, @rownum := @rownum + 1 AS rownum 
          FROM      (SELECT * 
                    FROM      (SELECT ccode, date, time, 'B' AS type, amount 
                              FROM booking
                              UNION
                              SELECT ccode, date, "0000" AS time, 'A' AS type, -amount 
                              FROM account) AS unsorted
                    ORDER BY ccode, date, time, type) AS sorted) AS numbered

Идея заключается в том, что вам сначала нужно получить бронирование (дебет) и аккаунт(кредиты) выстроились как в «несортированном» заявлении выше.Затем вам нужно отсортировать их по дате и времени, как в «отсортированном» утверждении.Затем добавьте номера строк к результатам, как в «пронумерованном» выражении.Наконец, выберите все эти данные вместе с суммой сумм с номером строки, меньшим или равным текущему номеру строки, который соответствует вашему ccode.

В будущем, пожалуйста, рассмотрите возможность использования какой-либо таблицы транзакций, которая содержитвсе изменения баланса аккаунта в одной таблице.

0 голосов
/ 02 сентября 2011

Я нашел ответ.

Это использовать кумулятивный SQL-оператор, чтобы найти текущий баланс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...