Я хочу создать SQL-запрос, который просматривает несколько строк и заполняет определенную информацию в определенных столбцах. Я использую SQL Server.
У меня есть 2 таблицы таблица транзакций и таблица данных транзакций. Пример данных ниже.
Что мне нужно, так это запрос, который возвращает это:
Столбец «Банк» и «Столбец суммы» должны получать свою информацию из записи, в которой в качестве категории указывается банк (например, первая строка в таблице TransData), а категория должна быть получена из столбца «Категория», если существует только одна другая запись. отдельно от банковской записи, в противном случае заполняется «Несколько»
Первоначально я думал, что это было относительно прямо, но я ошибался, и теперь я застрял.
Код, который я получил до сих пор:
SELECT
T.dtm_TransDate,
T.txt_Type,
T.txt_Description,
CASE
WHEN TD.txt_Category = 'Current' THEN TD.txt_Category
END AS 'Bank',
TD.dbl_Amount
FROM dbo.tbl_Trans AS T
JOIN dbo.tbl_TransData AS TD ON TD.int_TransID = T.int_Trans_ID
WHERE
(T.txt_Type = 'REC' OR T.txt_Type = 'PAY')
AND T.dtm_TransDate > '2019-02-01'
Это производит каждую запись, но мне нужно объединить несколько записей в одну.
Я не знал, нужно ли мне использовать для этого опорный пункт, но не знал, как это работает.
Любая помощь или указание мне в правильном направлении будет высоко ценится. Любая дополнительная информация необходима или уточнена, пожалуйста, дайте мне знать.
Заранее спасибо
3 ответа
Это может хорошо сработать для вас. Здесь у меня есть внутренняя предварительная группировка запросов по идентификатору транзакции. Я получаю сумму транзакций только в том случае, если она связана с «БАНКОМ», но также получаю описание и счет. В то же время, для тех, кто НЕ в качестве банка и получить максимальное описание ... если только один, здорово, у вас есть. Если их больше одного, у вас есть СЧЕТЧИК для этого тоже.
Затем внешний запрос применяет тест на основе столбца COUNTER для получения банка или категории (несколько) соответственно.
select
T.TransID,
T.TransDate,
T.Reference,
T.Description,
case when PQ.CountOfBank = 1
then PQ.SingleBank
else 'Multiple Bank' end Bank,
case when PQ.CountOfPurpose = 1
then PQ.SinglePurpose
else 'Multiple' end Category,
PQ.SumOfBank amount
from
(select
TD.TransID
sum( case when TD.Category = 'Bank'
then TD.Amount else 0 end ) SumOfBank,
sum( case when TD.Category = 'Bank'
then 1 else 0 end ) CountOfBank,
max( case when TD.Category = 'Bank'
then TD.Category else ' ' end ) as SingleBank,
sum( case when TD.Category = 'Bank'
then 0 else 1 end ) CountOfPurpose,
max( case when TD.Category = 'Bank'
then ' ' else TD.Category end ) as SinglePurpose
from
TransData TD
group by
TD.TransID ) PQ
JOIN Trans T
on PQ.TransID = T.TransID
Если вам нужен фильтр даты, добавьте его в часть предложения INNER PreQuery (PQ) WHERE.
Вы просто хотите group by
?
SELECT T.dtm_TransDate, T.txt_Type, T.txt_Description,
'BANK' as bank, -- unclear what the logic is here
(CASE WHEN MIN(TD.txt_Category) = MAX(TD.txt_Category)
THEN MIN(TD.txt_Category)
ELSE 'Multiple'
END) as category,
SUM(TD.dbl_Amount) as Amount
FROM dbo.tbl_Trans T JOIN
dbo.tbl_TransData TD
ON TD.int_TransID = T.int_Trans_ID
WHERE T.txt_Type IN ('REC', 'PAY') AND
T.dtm_TransDate > '2019-02-01'
GROUP BY T.dtm_TransDate, T.txt_Type, T.txt_Description,
Разве вы не можете просто использовать что-то похожее на приведенное ниже?
SELECT
T.dtm_TransDate,
T.txt_Type,
T.txt_Description,
CASE
WHEN TD.txt_Category = 'Current' THEN TD.txt_Category
END AS 'Bank',
MAX(TD.dbl_Amount)
FROM dbo.tbl_Trans AS T
JOIN dbo.tbl_TransData AS TD ON TD.int_TransID = T.int_Trans_ID
WHERE (T.txt_Type = 'REC' OR T.txt_Type = 'PAY')
AND T.dtm_TransDate > '2019-02-01'
GROUP BY T.dtm_TransDate, T.txt_Type, T.txt_Description, TD.txt_Category
Здесь я добавил MAX () для атрибута Amount, взятого из второй таблицы. Теоретически, это дает наибольшее значение атрибута TransID, к которому вы присоединяетесь.
Надеюсь это поможет :)
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.