Отчет об устаревании аккаунтов MySQL

0

Я пытаюсь получить запрос, работающий в MySQL 5.0.81, который вытащит сумму, причитающуюся по счетам, которые были оплачены.

У меня есть три таблицы, которые выглядят так:

CREATE TABLE `CLMS_invoices` (
  `invoices_id` mediumint(8) NOT NULL auto_increment,
  `invoices_client_id` mediumint(8) NOT NULL default '0',
  `invoices_datetimestamp` varchar(50) collate latin1_german2_ci NOT NULL default '',
  `invoices_description` varchar(100) collate latin1_german2_ci NOT NULL default '',
  `invoices_discount` decimal(12,2) NOT NULL default '0.00',
  `invoices_note` text collate latin1_german2_ci NOT NULL,
  `invoices_status` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`invoices_id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=5 ;

CREATE TABLE `CLMS_invoices_payments` (
  `invoices_payments_id` mediumint(8) NOT NULL auto_increment,
  `invoices_payments_invoice_id` mediumint(8) NOT NULL default '0',
  `invoices_payments_datetimestamp` varchar(50) collate latin1_german2_ci NOT NULL,
  `invoices_payments_type` mediumint(8) NOT NULL default '0',
  `invoices_payments_paid` decimal(12,2) NOT NULL default '0.00',
  PRIMARY KEY  (`invoices_payments_id`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=10 ;

CREATE TABLE `CLMS_invoices_products` (
  `invoices_products_id` mediumint(8) NOT NULL auto_increment,
  `invoices_products_invoice_id` mediumint(8) NOT NULL default '0',
  `invoices_products_name` varchar(50) collate latin1_german2_ci NOT NULL default '',
  `invoices_products_price` decimal(12,2) NOT NULL default '0.00',
  `invoices_products_profit` decimal(12,2) NOT NULL default '0.00',
  `invoices_products_qty` mediumint(8) NOT NULL default '0',
  `invoices_products_shipping` decimal(12,2) NOT NULL default '0.00',
  PRIMARY KEY  (`invoices_products_id`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=12 ;

Мне нужен запрос, чтобы сделать следующее: Вытяните счета-фактуры на основе client_id (invoices_client_id), которые не оплачены (invoices_status = 0).

Старение должно быть следующим: Менее 30 дней 31 - 60 дней 61 - 90 дней Более 90 дней

Он также должен будет вернуть идентификатор клиента, связанный с суммами, которые попадают в группы старения.

Значение доллара в группах должно быть рассчитано следующим образом: Стоимость счета-фактуры - стоимость счета-фактуры - сумма, выплаченная до настоящего времени

Стоимость счета-фактуры рассчитывается как

SUM ((invoices_products_price + invoices_products_profit + invoices_products_shipping) * invoices_products_qty) ГДЕ invoices_products_invoice_id = invoices_id

Скидка для счета хранится в invoices_discount

Сумма Плата пока рассчитывается как

SUM (invoices_payments_paid) ГДЕ invoices_payments_invoice_id = invoices_id

Конечный результат должен выглядеть примерно так:

client_id pastDue1 pastDue2 pastDue3 pastDue4
1 12.00 0.00 0.00 15.00
5 2.00 60.00 80.00 32.00
etc

Может кто-нибудь помочь мне построить этот запрос?

  • 2
    Этот стиль именования колонок меня тошнит.
  • 2
    Я хотел бы помочь! Куда я должен отправить свое предложение на консультационные услуги?
Показать ещё 3 комментария
Теги:

1 ответ

0

если я правильно понимаю - ключевая проблема здесь заключается в том, чтобы отделить всех пользователей от разных возрастных групп.

это может быть выполнено оператором IF(condition, then, else) в MySQL следующим образом:

помещает первый запрос во временную таблицу -

CREATE TABLE `tmeporary_invoices`
SELECT invoices.`invoices_client_id`,
       SUM((products.`invoices_products_price` + products.`invoices_products_profit` + products.`invoices_products_shipping`) * products.`invoices_products_qty`) AS invoice_product_cost,
       SUM(payments.`invoices_payments_paid`) AS amount_paid_so_far,
       IF(DATEDIFF(NOW(), invoices.`invoices_datetimestamp`) <= 30 , 'pastDue1', IF(DATEDIFF(NOW(),invoices.`invoices_datetimestamp`) <= 60, 'pastDue2', 'pastDue2' )) AS age
FROM `CLMS_invoices` invoices
     LEFT JOIN `CLMS_invoices_payments` payments
            ON payments.`invoices_payments_invoice_id` = invoices.`invoices_id`
     LEFT JOIN `CLMS_invoices_products` products
            ON products.`invoices_products_invoice_id` = invoices.`invoices_id`
WHERE invoices.`invoices_status = 0

после этого выберите из временной таблицы выше:

SELECT `invoices_client_id`,
       SUM(`invoice_product_cost`) AS invoice_product_cost,
       SUM(`amount_paid_so_far`) AS amount_paid_so_far,
       SUM(IF(`age` = 'pastDue1',1,0) AS `pastDue1`,
       SUM(IF(`age` = 'pastDue2',1,0) AS `pastDue2`,
       SUM(IF(`age` = 'pastDue3',1,0) AS `pastDue3`,
FROM `tmeporary_invoices`
GROUP BY `invoices_client_id`

Запросы должны использоваться как общее руководство по выполнению желаемых результатов (просто копирование/вставка их может привести к некоторым ошибкам в условных обозначениях/синтаксисе, поскольку я не мог их протестировать на данный момент.

Удачи!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню