我有一个桌子,用户正在维护,他们的公关。统计帐户可以定义它们想要汇总的帐户--不管是指定的还是范围的。如何构建一个视图来最好地总结金额、pr帐户和月份。我需要做点什么。帐户可以更改where子句。
下面是两个表: DimStatAccount和FactAmount,下面是预期的视图

发布于 2017-04-07 20:53:12
我偷了凯文回答的桌子。可以使用选择变量的能力从DimStatAccount表中创建动态select语句。
CREATE TABLE DimStatAccount (StatAccount varchar(255), Accounts varchar(255), AccountsRange varchar(255))
INSERT INTO DimStatAccount VALUES
('Stat1', 'in (1000,1020)', null),
('Stat2', 'in (1020,2020)', null),
('Stat3', null, 'between 1000 and 1999'),
('Stat4', null, 'between 2000 and 2999')
CREATE TABLE FactAmount (Account int, [Month] varchar(255), Amount int)
INSERT INTO FactAmount VALUES
(1000,'jan',500),
(1000,'feb',460),
(1010,'jan',799),
(1010,'jan',855),
(1010,'feb',633),
(1020,'feb',522),
(2000,'jan',436),
(2000,'jan',946),
(2000,'jan',374),
(2010,'jan',683),
(2010,'feb',492),
(2020,'jan',437),
(2020,'feb',834),
(2030,'jan',944)
DECLARE @sqlStatement NVARCHAR(MAX) = '';
SELECT @sqlStatement += CONCAT('SELECT ''',StatAccount,''',[Month],SUM(Amount) FROM FactAmount WHERE Account ',ISNULL(Accounts,AccountsRange),' GROUP BY [Month] UNION ALL ')
FROM DimStatAccount
;
SET @sqlStatement = LEFT(@sqlStatement,LEN(@sqlStatement)-10); --remove the final Union All
EXEC sp_executesql @sqlStatement;发布于 2017-04-07 20:27:40
正如前面已经说过的,动态sql是您所需要的。
CREATE TABLE #dimStatAccount (StatAccount varchar(255), Accounts varchar(255), AccountsRange varchar(255))
INSERT INTO #dimStatAccount VALUES
('Stat1', 'in (1000,1020)', null),
('Stat2', 'in (1020,2020)', null),
('Stat3', null, 'between 1000 and 1999'),
('Stat4', null, 'between 2000 and 2999')
CREATE TABLE #factAmount (Account int, [Month] varchar(255), Amount int)
INSERT INTO #factAmount VALUES
(1000,'jan',500),
(1000,'feb',460),
(1010,'jan',799),
(1010,'jan',855),
(1010,'feb',633),
(1020,'feb',522),
(2000,'jan',436),
(2000,'jan',946),
(2000,'jan',374),
(2010,'jan',683),
(2010,'feb',492),
(2020,'jan',437),
(2020,'feb',834),
(2030,'jan',944)
CREATE TABLE #result (StatAccount varchar(255), [Month] varchar(255), SumAmount int)
DECLARE @statAccount varchar(255), @accounts varchar(255), @rangeAccounts varchar(255)
DECLARE rcursor CURSOR FOR
SELECT StatAccount, Accounts, AccountsRange
FROM #dimStatAccount
OPEN rcursor
FETCH NEXT FROM rcursor
INTO @statAccount, @accounts, @rangeAccounts
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @sql NVARCHAR(max)
IF @accounts IS NOT NULL
BEGIN
SET @Sql = 'INSERT INTO #result '
SET @sql = @Sql + 'SELECT ''' + @statAccount + ''' AS StatAccount, [MONTH], SUM(f.Amount) AS SumAmount '
SET @Sql = @Sql + 'FROM #factAmount AS f '
SET @Sql = @Sql + 'WHERE Account ' + @accounts + ' '
SET @Sql = @Sql + 'GROUP BY [Month]'
EXEC sp_executesql @Sql
FETCH NEXT FROM rcursor
INTO @statAccount, @accounts, @rangeAccounts
END
IF @rangeAccounts IS NOT NULL
BEGIN
SET @Sql = 'INSERT INTO #result '
SET @sql = @Sql + 'SELECT ''' + @statAccount + ''' AS StatAccount, [MONTH], SUM(f.Amount) AS SumAmount '
SET @Sql = @Sql + 'FROM #factAmount AS f '
SET @Sql = @Sql + 'WHERE Account ' + @rangeAccounts + ' '
SET @Sql = @Sql + 'GROUP BY [Month]'
print @Sql
EXEC sp_executesql @Sql
FETCH NEXT FROM rcursor
INTO @statAccount, @accounts, @rangeAccounts
END
END
CLOSE rcursor
DEALLOCATE rcursor
SELECT * FROM #result结果
StatAccount Month SumAmount
-----------------------------
Stat1 feb 982
Stat1 jan 500
Stat2 feb 1356
Stat2 jan 437
Stat3 feb 1615
Stat3 jan 2154
Stat4 feb 1326
Stat4 jan 3820https://stackoverflow.com/questions/43285819
复制相似问题