Запросите группы, основанные на компании, типе вывода и самой последней дате - PullRequest
1 голос
/ 29 апреля 2019

Я пытаюсь создать запрос, который суммируется на основе типа вывода и самой последней даты (из таблицы, которую я перечислил как c5 в SQL). Я также хочу, чтобы он суммировал общую сумму сбережений из таблицы c4. У меня есть следующие настройки:

c5:

+---------+------------+-----------------+------------+----------+
| Company | CashAmount | Withdrawal Type | Date       | Interest |
+---------+------------+-----------------+------------+----------+
| A       | 10         | Type1           | 02/28/2019 | 5        |
+---------+------------+-----------------+------------+----------+
| A       | 20         | Type1           | 02/28/2019 | 1        |
+---------+------------+-----------------+------------+----------+
| B       | 15         | Type2           | 01/31/2019 | 1        |
+---------+------------+-----------------+------------+----------+

c4:

+---------+---------+------------+
| Company | Savings | Date       |
+---------+---------+------------+
| A       | 5       | 02/28/2019 |
+---------+---------+------------+
| A       | 5       | 02/28/2019 |
+---------+---------+------------+
| B       | 16      | 01/31/2019 |
+---------+---------+------------+
| B       | 12      | 02/28/2019 |
+---------+---------+------------+
| B       | 1       | 01/31/2019 |
+---------+---------+------------+
| A       | 3       | 12/29/2018 |
+---------+---------+------------+

Итак, на основании этого примера данных я бы хотел сгенерировать следующую таблицу:

+---------+-------------+-------------+--------------+
| Company | Total_Type1 | Total_Type2 | SumOfSavings |
+---------+-------------+-------------+--------------+
| A       | 30          | 0           | 13           |
+---------+-------------+-------------+--------------+
| B       | 0           | 0           | 29           |
+---------+-------------+-------------+--------------+

Я проверил запрос, используя следующий SQL, к сожалению, он не работает.

SELECT c4.company, Sum(iif(c5.[withdrawal type] = "type1" AND c5.[date] = max(c5.[date]), [c5].[CashAmount],0)) AS Total_type1, Sum(c4.Savings) as SumofSavings
FROM c004_table1 AS c4 LEFT JOIN c005_table2 AS c5 ON (c4.company = c5.company) AND (c4.[Date] = c5.[Date])
Group by c4.company;

Буду очень признателен за любой совет, как заставить его работать. Спасибо!

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

Попробуйте:

select
    c5.company,
    sum(
        iif(
            c5.[withdrawal type] = "type1" and c5.[withdrawal date] >= cd.savingsdate,
            c5.cashamount,
            0
        )
    ) as type_1,
    sum(
        iif(
            c5.[withdrawal type] = "type2" and c5.[withdrawal date] >= cd.savingsdate,
            c5.cashamount,
            0
        )
    ) as type_2,
    min(cd.sumsavings) as s
from c5
inner join 
(
    select company, max([savings date]) as savingsdate, sum(savings) as sumsavings
    from c4
    group by company
) cd on c5.company = cd.company
group by c5.company

Вместо зарезервированного слова Date я использовал [дату сбережения], чтобы уменьшить свою путаницу.

Снимок экрана таблицы c4

enter image description here

Снимок экрана таблицы c5

enter image description here

Результат запроса

enter image description here

1 голос
/ 29 апреля 2019

Сначала объедините вторую таблицу, чтобы получить максимальную дату.Затем снова агрегируйте, чтобы получить информацию из первой таблицы.

select t1.company,
       sum(iif(Withdrawal_type = "type_1", cashamount, 0)) as type_1,
       sum(iif(Withdrawal_type = "type_2" and t1.date = t2.max_date, cashamount, 0)) as type_2,
       t2.sum_savings
from c004_table1 as t1 left join
     (select company, sum(savings) as sum_savings, max(date) as max_date
      from c005_table2
      group by company
     ) as t2
     on t2.company = t1.company
group by t1.company, t2.sum_savings;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...