Используйте две группы с одним оператором выбора

у меня две таблицы

  1. дата с идентификатором столбца, годом, месяцем
  2. транзакции со столбцами id, сумма, тип, доход, инструмент

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

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

Я могу получить значения, используя два разных запроса

пример:

чтобы получить сумму дохода, сгруппированного по годам и месяцам:

  select sum(T.income) as total
    from transaction as T, date as D
   where D.id = T.id
group by D.month, D.year)

И чтобы получить другие значения:

  select D.year, D.month,
         T.type, T.instrument, sum(T.amount) as sumAmount,T.income
    from date as D, transaction as T 
   where D.id=T.id,
group by T.instrument, T.type

но мне нужно сделать это одним запросом. Есть ли другой способ получить этот набор данных? Можно ли использовать group by двумя способами в одном и том же операторе select?


person user1500724    schedule 06.08.2012    source источник
comment
почему вам нужно сделать это в одном заявлении? как вы используете результаты?   -  person cegfault    schedule 06.08.2012


Ответы (1)


Это тот, кого вы ищете?

SELECT tableA.ID, tableA.`Year`, tableA.`Month`,  
       tableA.`Type`, tableA.instrument, 
       tableA.totalAmount, tableB.totalInstrument
FROM
(
    SELECT  a.ID, a.`Year`, a.`Month`, 
            b.`Type`, b.instrument, 
            SUM(b.`amount`) totalAmount
    FROM    `date` a
                INNER JOIN `transactions` b
                    ON a.ID = b.id
    GROUP BY b.`Type
) tableA
INNER JOIN
(
    SELECT  a.ID, a.`Year`, a.`Month`, 
            b.`Type`, b.instrument, 
            SUM(b.`instrument`) totalInstrument
    FROM    `date` a
                INNER JOIN `transactions` b
                    ON a.ID = b.id
    GROUP BY a.`Year`, a.`Month`
) tableB ON tableA.ID = tableB.ID AND
            tableA.`Year` = tableB.`Year` AND
            tableA.`Month` = tableB.`Month`

первый подзапрос получает сумму суммы, а второй подзапрос получает сумму инструмента. их результаты будут объединены, чтобы получить totalAmount и totalInstrument подряд.

person John Woo    schedule 06.08.2012
comment
Да, этот запрос помог. Спасибо. - person user1500724; 06.08.2012
comment
это ответило на ваш вопрос? :) - person John Woo; 06.08.2012
comment
@ user1500724: Если это ответило на ваш вопрос, не могли бы вы дать ответ Джона Ву как правильный ответ, чтобы он помог будущим посетителям? - person Whirl Mind; 27.08.2017