如何在 do 列中按日期划分分组数据
How can I divide grouped data by date in do columns
我有一个数据集,我想按客户代码分组,对于每个代码,我想对一个月的日期之间的交易总计求和,并让每个月成为一个单独的列。我可以使这个动态我主要关心的是构造初始 select 以根据需要输出数据。
我有:
SELECT [cmasterno]
,CASE
WHEN Month([dtrs]) = 1
AND Year([dtrs]) = YEAR(GETDATE())
THEN SUM([nftrsamt])
END AS 'Jan 2014'
,CASE
WHEN Month([dtrs]) = 2
AND Year([dtrs]) = YEAR(GETDATE())
THEN SUM([nftrsamt])
END AS 'Feb 2014'
FROM [AccountMate].[dbo].[gltrsn]
WHERE csource LIKE 'AR'
AND cacctid LIKE '%4220%'
GROUP BY cmasterno
数据样本为
cmasterno dtrs ntrsamt
CEN01-A 1/24/2014 -22.2
AUT129-A 2/24/2014 -0.84
CEN01-A 1/22/2014 -19.86
CEN01-A 2/22/2014 -13.2
AUT129-A 1/22/2014 -18.42
AUT129-A 1/22/2014 -1
AUT129-A 2/22/2014 -316.56
CEN01-A 2/21/2014 -2.04
使用条件SUM
SELECT [cmasterno],
SUM (CASE
WHEN Month([dtrs]) = 1 AND Year([dtrs]) = YEAR(GETDATE())
THEN [nftrsamt]
ELSE 0
END
) AS 'Jan 2014',
SUM (CASE
WHEN Month([dtrs]) = 2 AND Year([dtrs]) = YEAR(GETDATE())
THEN [nftrsamt]
ELSE 0
END
) AS 'Feb 2014'
FROM [AccountMate].[dbo].[gltrsn]
WHERE csource LIKE 'AR'
AND cacctid LIKE '%4220%'
GROUP BY cmasterno
为了完整起见,您也可以使用联接来完成此操作
SELECT [cmasterno], sum(jan.nftrsamt) as 'Jan 2014', sum(feb.nftrsamt) as 'Feb 2014'
FROM [AccountMate].[dbo].[gltrsn] b
LEFT JOIN [AccountMate].[dbo].[gltrsn] jan on b.cacctid = jan.cacctid and Month(jan.[dtrs]) = 1 AND Year(jan.[dtrs]) = YEAR(GETDATE())
LEFT JOIN [AccountMate].[dbo].[gltrsn] feb on b.cacctid = feb.cacctid and Month(feb.[dtrs]) = 2 AND Year(feb.[dtrs]) = YEAR(GETDATE())
WHERE csource LIKE 'AR' AND cacctid LIKE '%4220%'
GROUP BY cmasterno
根据您的索引,连接可能比案例快得多。那是 O(1) 而不是 O(N)
我有一个数据集,我想按客户代码分组,对于每个代码,我想对一个月的日期之间的交易总计求和,并让每个月成为一个单独的列。我可以使这个动态我主要关心的是构造初始 select 以根据需要输出数据。
我有:
SELECT [cmasterno]
,CASE
WHEN Month([dtrs]) = 1
AND Year([dtrs]) = YEAR(GETDATE())
THEN SUM([nftrsamt])
END AS 'Jan 2014'
,CASE
WHEN Month([dtrs]) = 2
AND Year([dtrs]) = YEAR(GETDATE())
THEN SUM([nftrsamt])
END AS 'Feb 2014'
FROM [AccountMate].[dbo].[gltrsn]
WHERE csource LIKE 'AR'
AND cacctid LIKE '%4220%'
GROUP BY cmasterno
数据样本为
cmasterno dtrs ntrsamt
CEN01-A 1/24/2014 -22.2
AUT129-A 2/24/2014 -0.84
CEN01-A 1/22/2014 -19.86
CEN01-A 2/22/2014 -13.2
AUT129-A 1/22/2014 -18.42
AUT129-A 1/22/2014 -1
AUT129-A 2/22/2014 -316.56
CEN01-A 2/21/2014 -2.04
使用条件SUM
SELECT [cmasterno],
SUM (CASE
WHEN Month([dtrs]) = 1 AND Year([dtrs]) = YEAR(GETDATE())
THEN [nftrsamt]
ELSE 0
END
) AS 'Jan 2014',
SUM (CASE
WHEN Month([dtrs]) = 2 AND Year([dtrs]) = YEAR(GETDATE())
THEN [nftrsamt]
ELSE 0
END
) AS 'Feb 2014'
FROM [AccountMate].[dbo].[gltrsn]
WHERE csource LIKE 'AR'
AND cacctid LIKE '%4220%'
GROUP BY cmasterno
为了完整起见,您也可以使用联接来完成此操作
SELECT [cmasterno], sum(jan.nftrsamt) as 'Jan 2014', sum(feb.nftrsamt) as 'Feb 2014'
FROM [AccountMate].[dbo].[gltrsn] b
LEFT JOIN [AccountMate].[dbo].[gltrsn] jan on b.cacctid = jan.cacctid and Month(jan.[dtrs]) = 1 AND Year(jan.[dtrs]) = YEAR(GETDATE())
LEFT JOIN [AccountMate].[dbo].[gltrsn] feb on b.cacctid = feb.cacctid and Month(feb.[dtrs]) = 2 AND Year(feb.[dtrs]) = YEAR(GETDATE())
WHERE csource LIKE 'AR' AND cacctid LIKE '%4220%'
GROUP BY cmasterno
根据您的索引,连接可能比案例快得多。那是 O(1) 而不是 O(N)