СУММА отдельных строк в SQL - PullRequest
0 голосов
/ 01 октября 2019

В SQL мы используем SUM(), чтобы найти общее значение в столбцах. Я хочу получить сумму в 100 строк.

Если имеется 5 строк, то упоминание имен столбцов в порядке, но написание 100 имен столбцов затруднительно. Есть ли ярлык для поиска суммы отдельных строк?

В этом например. Мне нужно вычислить только три строки, что если бы мне пришлось рассчитывать доход с 1990 года?

select  
    t8.Team, 
    t7.[Revenue ($M)] as 'revenue2017',
    t8.[Revenue ($M)] as 'revenue2018',
    t9.[Revenue ($M)]  as 'revenue2019'
from
    table2018 t8
Join  
    WealthyFootballClubs.dbo.table2017 t7 On t7.Team = t8.Team 
Join  
    WealthyFootballClubs.dbo.table2019 t9 On t9.team = t8.team

Выход

Team              revenue2017   revenue2018     revenue2019 
-----------------------------------------------------------
Manchester United     850          737              795         
Real Madrid           688          735              896            
Barcelona             690          706              824            
Bayern Munich         657          640              751 
Manchester City       650          575              678 
Liverpool             523          462              613

1 Ответ

0 голосов
/ 02 октября 2019

Вы знаете, как выглядит оператор, поэтому просто создайте его, используя динамические операторы T-SQL и системные представления. Примерно так:

DECLARE @DataSource TABLE
(
    [name] SYSNAME
   ,[table_alias] VARCHAR(12)
   ,[column_alias] VARCHAR(12)
);

DECLARE @DynamicTSQLStatement NVARCHAR(MAX);

DECLARE @BaseTableName SYSNAME
       ,@BaseTableAlias VARCHAR(12);

INSERT INTO @DataSource ([name], [table_alias], [column_alias])
SELECT [name]
      ,'T' + CAST(ROW_NUMBER() OVER (ORDER BY [name] ASC) AS VARCHAR(12))
      ,'revenue' + CAST(TRY_CAST(REPLACE([name], 'table', '') AS INT) AS VARCHAR(12))
FROM [sys].[tables]
WHERE [schema_id] = SCHEMA_ID('dbo')
    AND TRY_CAST(REPLACE([name], 'table', '') AS INT) BETWEEN 1990 AND 2019;

SELECT @BaseTableName = [name]
      ,@BaseTableAlias = [table_alias]
FROM @DataSource
WHERE [name] <> 'table2018';







SET @DynamicTSQLStatement = 'SELECT ' + @BaseTableAlias + '.[Team]';

SELECT @DynamicTSQLStatement = @DynamicTSQLStatement + STUFF
(
    (
        SELECT ',' + [table_alias] + '.[Revenue ($M)] AS [' + [column_alias] + ']'
        FROM @DataSource 
        ORDER BY [name]
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
   ,1
   ,0
   ,''
);

SET @DynamicTSQLStatement = @DynamicTSQLStatement + ' FROM ' + @BaseTableName + ' ' + @BaseTableAlias + ' ';

SELECT @DynamicTSQLStatement = @DynamicTSQLStatement + STUFF
(
    (
        SELECT ' INNER JOIN [dbo].[' + [name] + '] AS ' + [table_alias] + ' ON ' + [table_alias] + '.[team] = ' + @BaseTableAlias + '.[Team]' 
        FROM @DataSource
        WHERE [name] <> @BaseTableName
        ORDER BY [name]
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
   ,1
   ,0
   ,''
);

EXEC sp_executesql @DynamicTSQLStatement;

Я использую TRY_CAST, чтобы получить только те таблицы, которые мне интересны, но если эта функция не поддерживается в вашем издании, вы можете изменить критерии фильтрации. Остальная часть кода должна работать на каждой редакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...