SQL查询可根据条件将多条记录合并为一行

时间:2019-05-03 10:30:21

标签: sql sql-server

我想生成一个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 个答案:

答案 0 :(得分:1)

这可能适合您。在这里,我对每个交易ID都有一个内部查询预分组。仅当与“ BANK”相关联时,我才得到交易的总和,而且得到描述和计数。同时,为那些不是银行的人做准备,并获得最大的描述...如果只有一个,那就太好了,您就拥有了。如果不止一个,您也可以使用COUNTER。

然后,外部查询将根据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 :(得分:0)

您只想要一个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,

答案 2 :(得分:0)

您不能只使用类似于以下内容的内容吗?:

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

我在这里所做的是在第二个表中获取的Amount属性上添加一个MAX()。从理论上讲,这样做是为了最大程度地提高您要加入的TransID属性的价值。

希望这会有所帮助:)