Объединять таблицы, когда имя столбца является строкой - PullRequest
0 голосов
/ 04 июня 2018

Я выполняю запрос, подобный следующему:

SELECT      c.name  AS 'ColumnName'
        ,t.name AS 'TableName'
FROM        sys.columns c
JOIN        sys.tables  t   ON c.object_id = t.object_id
WHERE       (c.name='loaddate')
and (t.name like '%_agent%')
ORDER BY    TableName
        ,ColumnName;

, который возвращает: что-то вроде этого:

columnname|TableName
loaddate| gov_agent
loaddate| fin_agent
loaddate| sav_agent

В этих таблицах существует дата под столбцом loaddate.Например, gov_agent может выглядеть следующим образом:

  loaddate|entity|category
2018-06-01|James |A
2018-06-01|Jim   |B
2018-05-30|Bob   |B
2018-05-29|Kevin |C

Что мне нужно вернуть, так это максимальное значение даты, указанное в каждой таблице, чтобы мои результаты выглядели так

loaddate| gov_agent|2018-06-01
loaddate| fin_agent|2018-06-01
loaddate| sav_agent|2018-03-02

Мне неизвестен какой-либо простой способ присоединиться к этим таблицам, чтобы вернуть максимальную дату или, если это вообще возможно.Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 04 июня 2018

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

USE YourDatabase;
GO
DECLARE @SQL nvarchar(MAX);

SET @SQL = N'SELECT' + STUFF((SELECT NCHAR(10) + N'UNION ALL' + NCHAR(10) +
                                      N'SELECT ' + QUOTENAME(c.[name],N'''') + N' AS ColumnName,' + NCHAR(10) +
                                      N'       ' + QUOTENAME(t.[name],N'''') + N' AS TableName,' + NCHAR(10) +
                                      N'       (SELECT MAX(' + QUOTENAME(c.[name]) + N') FROM ' + QUOTENAME(t.[name]) + N') AS MaxLoadDate'
                               FROM sys.columns c
                                    JOIN sys.tables t ON c.object_id = t.object_id
                               WHERE c.[name] ='loaddate'
                                 AND t.name LIKE '%[_]agent%' --I assumed that the understore is not meant to be a wildcard
                               FOR XML PATH(N'')),1,17,N'');
PRINT @SQL; --Your best friend
EXEC sp_executesql @SQL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...