Я хочу создать 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'

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

Я не знал, нужно ли мне использовать для этого опорный пункт, но не знал, как это работает.

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

Заранее спасибо

0
jAshton 3 Май 2019 в 13:30

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.

1
DRapp 3 Май 2019 в 11:24

Вы просто хотите 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,
0
Gordon Linoff 3 Май 2019 в 10:34

Разве вы не можете просто использовать что-то похожее на приведенное ниже?

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, к которому вы присоединяетесь.

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

0
Michele La Ferla 3 Май 2019 в 10:49