SQL-запрос для консолидации нескольких записей в одной строке на основе критериев - PullRequest
0 голосов
/ 03 мая 2019

Я хочу создать SQL-запрос, который просматривает несколько строк и заполняет определенную информацию в определенных столбцах.Я использую SQL Server.

У меня есть 2 таблицы: таблица транзакций и таблица данных транзакций.Пример данных ниже.

enter image description here

enter image description here

Я хочу запрос, который возвращает это:

enter image description here

Столбец банка и столбец суммы должны получать информацию из записи, в которой в качестве категории указан банк (т.е. первая строка в 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 ]

1 голос
/ 03 мая 2019

Это может хорошо сработать для вас. Здесь у меня есть внутренняя предварительная группировка запросов по идентификатору транзакции. Я получаю сумму транзакций только в том случае, если она связана с «БАНКОМ», но также получаю описание и счет. В то же время, для тех, кто НЕ в качестве банка и получить максимальное описание ... если только один, здорово, у вас есть. Если их больше одного, у вас тоже есть СЧЕТЧИК.

Затем внешний запрос применяет тест на основе столбца 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.

0 голосов
/ 03 мая 2019

Разве вы не можете просто использовать что-то похожее на приведенное ниже?Теоретически это позволяет получить наибольшее значение атрибута TransID, к которому вы присоединяетесь.

Надеюсь, это поможет:)

0 голосов
/ 03 мая 2019

Вы просто хотите 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,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...