我想生成一个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'
这会生成每条记录,但是我需要将多条记录合并为一个。
我不知道是否需要为此使用枢轴,但是不确定其工作原理。
任何帮助或为我指明正确的方向将不胜感激。任何需要进一步澄清的信息,请让我知道。
预先感谢
答案 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属性的价值。
希望这会有所帮助:)