2013-11-28 3 views
1

У меня есть три таблицы: счета-фактуры, платежи и возмещение. Я хотел бы получить счет txn по типу, сгруппированный по месяцам/годам.Подсчитывает из трех таблиц в одном запросе?

Я ищу результатов, как:

Month-Year Invoices Payments Refunds 
01-2013  32432  534  32 
02-2013  4323  789   53 

я могу получить значение подсчета одной таблицы (минус некоторые отливка) что-то вроде:

SELECT 
    YEAR(txndate) 
    , MONTH(txndate) 
    , COUNT(*) 
    , "Invoice" AS type 
FROM invoices 
GROUP BY 
    YEAR(txndate) 
    , MONTH(txndate) 

Если это сводится к этому, я может просто сделать три запроса (по одному на каждую таблицу), а затем консолидировать мои результаты, но я полагаю, что это должно быть более разумным способом.

Каждая таблица имеет столбец TxnDate.

Любые предложения?

+0

sqlfiddle или аналогичный? – Strawberry

ответ

2

Не уверен, что это на самом деле проще, но вы могли бы построить что-то подобное с кучей UNION с:

SELECT year, month, SUM(invoice) AS invoices, SUM(payment) AS payments, SUM(refund) AS refunds 
FROM (SELECT YEAR(txndate) AS year, MONTH(txndate) AS month, 
      1 AS invoice, 0 AS payment, 0 AS refund 
     FROM invoices 
     UNION ALL 
     SELECT YEAR(txndate) AS year, MONTH(txndate) AS month, 
      0 AS invoice, 1 AS payment, 0 AS refund 
     FROM payments 
     UNION ALL 
     SELECT YEAR(txndate) AS year, MONTH(txndate) AS month, 
      0 AS invoice, 0 AS payment, 1 AS refund 
     FROM refunds) t 
GROUP BY year, month 
+0

Eek, что уродливо. Я не могу придумать лучшего решения для 1 вопроса, хотя – Cruncher

+0

Хм, что вы думаете о внешнем соединении трех таблиц и подсчете ненулевых значений? – Cruncher

+0

@Cruncher не совсем уверен, как это сработает. К чему бы вы присоединились? Я не думаю, что есть гарантия, что дата уникальна в любой из таблиц. – Mureinik

0

Вы могли бы попробовать что-то вроде этого, поставив выбирает перед от

SELECT 

(SELECT COUNT(*) 
FROM invoices 
WHERE YEAR(txndate) = YEAR(main.txndate) AND MONTH(txndate) = MONTH(main.txndate)) 
as invoices, 

(SELECT COUNT(*) 
FROM payments 
WHERE YEAR(txndate) = YEAR(main.txndate) AND MONTH(txndate) = MONTH(main.txndate)) 
as payments, 

(SELECT COUNT(*) 
FROM refunds 
WHERE YEAR(txndate) = YEAR(main.txndate) AND MONTH(txndate) = MONTH(main.txndate)) 
as refunds 

FROM invoices as main 
GROUP BY YEAR(txndate), MONTH(txndate) 
Смежные вопросы