SQL-запрос для поиска даты, TranscationAmount_US, TransactionAmount_UK - PullRequest
0 голосов
/ 25 января 2019

У нас есть 2 таблицы:

Transaction (AccountId,Date,TransactionAmount)
Master(Aid,Country)

Нам нужно найти Date, TotalTAmt_US, Total_TAmt_UK

Мое решение:

Select
  Date,
  CASE WHEN Country in ('US') THEN SUM(TransAmt) ELSE '0'END AS TotalTAmt_US,
  CASE WHEN Country in ('UK') THEN SUM(TransAmt) ELSE '0'END AS TotalTAmt_UK
FROM
(
SELECT
  T.Date As Date,
  M.Country As Country,
  SUM(T.TransAmt) As TransAmt,
FROM
  Transaction T JOIN Master M On T.Aid = M.Aid
WHERE Country in ('US','UK')
group by Date,Country
) As T1
group by Date;

Это правильно?Можем ли мы использовать Страна в CASE WHEN, не тянув ее, поскольку я не хочу ее тянуть, а затем группировать по ней.

Совет, пожалуйста.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Я полагаю, что вы хотели выполнить условное агрегирование, получая сумму за все транзакции в США за день и сумму всех транзакций в Великобритании за тот же день. Затем вам пришлось переместить CASE в sum(), добавив сумму только в том случае, если вы ищите страну, в противном случае ноль.

Также ваш подзапрос не нужен.

SELECT t.date,
       sum(CASE m.country
             WHEN 'US' THEN
               t.transamt
             ELSE
               0
           END) totaltamt_us,
       sum(CASE m.country
             WHEN 'UK' THEN
               t.transamt
             ELSE
               0
           END) totaltamt_uk
       FROM transaction t
            INNER JOIN master m
                       ON m.aid = t.accountid
       WHERE m.county IN ('US',
                          'UK')
       GROUP BY t.date;

Если вы не настаиваете на том, чтобы в разных столбцах были разные суммы, но также принимаете строки, это может быть просто:

SELECT m.country,
       t.date,
       sum(t.transamt) totaltamt
       FROM transaction t
            INNER JOIN master m
                       ON m.aid = t.accountid
       WHERE m.county IN ('US',
                          'UK')
       GROUP BY m.country,
                t.date;
0 голосов
/ 25 января 2019

Я думаю, вы хотите условное агрегирование:

SELECT Date,
       SUM(CASE WHEN Country in ('US') THEN TransAmt ELSE 0 END) AS TotalTAmt_US,
       SUM(CASE WHEN Country in ('UK') THEN TransAmt ELSE 0 END) AS TotalTAmt_UK
FROM Transaction T JOIN
     Master M
     On T.Aid = M.Aid
WHERE Country in ('US', 'UK')
GROUP BY Date;

Примечания:

  • Вам не нужно два уровня агрегации.
  • Числа не должны быть заключены в одинарные кавычки, поэтому 0, а не '0'.
0 голосов
/ 25 января 2019

Вы должны объявить в разделе GROUP BY все столбцы, которые вы используете в операторе выбора.Просто поместите ваши дела в группу.

Select
  Date,
  CASE WHEN Country in ('US') THEN TransAmt ELSE 0 END AS TotalTAmt_US,
  CASE WHEN Country in ('UK') THEN TransAmt ELSE 0 END AS TotalTAmt_UK
FROM
(
  SELECT
    T.Date As Date,
    M.Country As Country,
    SUM(T.TransAmt) As TransAmt,
  FROM
    Transaction T JOIN Master M On T.Aid = M.Aid
  WHERE Country in ('US','UK')
  GROUP BY Date,Country
) As T1
GROUP BY Date, CASE WHEN Country in ('US') THEN TransAmt ELSE 0 END AS   
         TotalTAmt_US, CASE WHEN Country in ('UK') THEN TransAmt ELSE 0 END  
         AS TotalTAmt_UK

Дополнительно, удалите функцию SUM () в ваших условиях.Если вы поместите их в GROUP BY, вы можете получить ошибку:

ORA-00934: Group function is not allowed here.

И, в конце концов, уберите галочки в нулях в условиях ELSE.Вы можете получить еще одну ошибку о несовместимых типах данных.

...