2014-12-31 2 views
2

У меня есть ниже 2 таблицы:Поиск макс (дата) из полученного запроса вывода

table1

objName | rptName | srcTblName | srcFileName | srcDateColName 
-------------------------------------------------------------- 
obj1 | rpt1 | srcTbl1 | srcFile1.csv| srcDate 

table2

FileName  | FileSize 
------------------------ 
srcFile1.csv | 2009 

Ниже запроса дает мне отличную таблицу и имена столбцов даты.

SELECT DISTINCT a.srcTblName, a.SrcDateColName 
FROM table1 a 
LEFT JOIN table2 b 
ON a.srcFileName LIKE b.FileName 
WHERE a.srcTblName is NOT NULL 
AND a.srcFileName is NOT NULL 

Выход

srcTblName    | srcDateColName 
--------------------------------------------- 
tableN     | EntryDate 
tableO     | Modified_Date 

Второй столбец выходного сигнала является COLUMN_NAME в SrcTblName, который является дату.

Я хочу найти макс (srcDateColName) из соответствующего srcTblName в том же запросе. Может ли кто-нибудь помочь мне изменить указанный выше запрос?

+0

неясно, сообщение некоторые данные образца. или используйте 'sqlfiddle' –

+0

, вы можете использовать курсор, чтобы выполнить свою работу, если хотите, я могу предоставить вам запрос – Monah

ответ

0

ответы, данные Хади и Сарат, кажется чтобы работать, но курсор, похоже, влияет на исполнитель се. Так что я сделал это, используя временную таблицу, как показано ниже:

DECLARE @OBJECT_NAME VARCHAR(50) = 'ObjName'  

BEGIN 
DECLARE @Query NVARCHAR(1000),@COUNT INT, @MAX_Count INT, @rptName VARCHAR(255) 
DECLARE @tblName varchar(100),@dateColName varchar(100), @max_Date Date,@fileName varchar(100),@refID INT 

DECLARE @Temp_Table TABLE([RowNumber] INT,rptName VARCHAR(500),SrcTblName VARCHAR(500), DateColName VARCHAR(100), SrcFileName VARCHAR(600), RefID INT) 
INSERT INTO @Temp_Table 
SELECT 
    ROW_NUMBER()OVER(ORDER BY rptName) 
    ,rptName 
    ,srcTblName 
    ,srcDateColName 
    ,srcFileName 
    ,ID 
FROM 
    table1 
WHERE 
    objName = @OBJECT_NAME 

SELECT @MAX_Count = MAX(RowNumber) FROM @Temp_Table 
SET @COUNT = 1 
WHILE (@COUNT <= @MAX_Count) 
BEGIN     
    SELECT 
     @rptName = rptName, 
     @tblName = SrcTblName, 
     @fileName = SrcFileName, 
     @dateColName = DateColName, 
     @refID = RefID  
    FROM 
     @Temp_Table 
    WHERE 
     RowNumber = @COUNT 

    IF @tblName IS NOT NULL AND @fileName IS NOT NULL AND @dateColName IS NOT NULL 
    BEGIN 
     SET @Query = 'SELECT @max_Date = MAX(CONVERT(DATE, ' + @dateColName + ')) FROM ' + @tblName 
      EXEC SP_EXECUTESQL @Query, N'@max_Date DATE OUTPUT', @max_DATE OUTPUT 

    END 
SET @COUNT = @COUNT + 1 
END 

END 

Я надеюсь, что это поможет кому-то, кто приходит на поиск подобного решения. Спасибо за вашу помощь хотя :)

+0

Даже если вы не использовали ** CURSOR **, ваш запрос работает так же, как в каждом цикле вы извлекаете записи и выполняете свои вычисления. @Touhid K. –

+0

И работа ** цикла CURSOR ** и ** WHILE ** зависит от ситуаций. Вы можете прочитать различные блоги и форумы для сравнения. @Touhid K. –

+0

@Sarath Avanavu: Хорошо, это ново для меня. Я проверю это. Благодарю. –

0

Используйте следующий запрос, надеюсь, это вам поможет.

SELECT a.srcTblName, max(a.SrcDateColName) 
FROM table1 a 
LEFT JOIN table2 b 
ON a.srcFileName LIKE b.FileName 
WHERE a.srcTblName is NOT NULL 
AND a.srcFileName is NOT NULL 
group by a.srcTblName 
+0

Не думаю, что вы получили мой вопрос правильно. srcTblName - это имя другой таблицы в базе данных. и srcDateColName - это имя столбца в этой таблице. Я хочу найти максимальную (дату) из этой таблицы. –

+0

В этом случае вы не могли бы сделать это в одном запросе. попробуйте написать функцию. –

1

Поскольку вы должны выполнить имя_таблицы и datecolumn из таблицы, вы должны использовать динамический SQL

SELECT * INTO tableN FROM 
(
SELECT '01/JAN/2014' EntryDate 
UNION ALL 
SELECT '24/JAN/2014' 
UNION ALL 
SELECT '13/MAR/2014' 
)TAB 


SELECT * INTO tableO FROM 
(
SELECT '11/APR/2014' Modified_Date 
UNION ALL 
SELECT '18/MAY/2014' 
UNION ALL 
SELECT '22/JUN/2014' 
)TAB 

SELECT * INTO NEWTBL FROM 
(
    SELECT 'tableN' srcTblName,'EntryDate' srcDateColName 
    UNION ALL 
    SELECT 'tableO' ,'Modified_Date' 
)TAB 

Создайте временную таблицу, чтобы получить результат

CREATE TABLE #TEMP(srcTblName VARCHAR(100),srcDateColName VARCHAR(100),NEWDATE DATE) 

Теперь использовать курсора и выполнить его динамически

DECLARE @TABLENAME VARCHAR(100) 
DECLARE @COLUMNNAME VARCHAR(100) 

-- Here you declare which all columns you need to loop in Cursor 
DECLARE CUR CURSOR FOR 

-- Use your SELECT here instead of SELECT srcTblName , srcDateColName FROM NEWTBL 

--SELECT DISTINCT a.srcTblName, a.SrcDateColName 
--FROM table1 a 
--LEFT JOIN table2 b 
--ON a.srcFileName LIKE b.FileName 
--WHERE a.srcTblName is NOT NULL 
--AND a.srcFileName is NOT NULL 

SELECT srcTblName , srcDateColName 
FROM NEWTBL 


OPEN CUR 

-- Select each tablename and datecolumn and execute dynamically 
FETCH NEXT FROM CUR 
INTO @TABLENAME,@COLUMNNAME 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    DECLARE @QRY NVARCHAR(MAX) 

    SET @QRY = ' 
      INSERT INTO #TEMP 
      SELECT '''[email protected]+''' , '''[email protected]+''', 
      (SELECT MAX(CAST('[email protected]+' AS DATE))ENDT FROM '[email protected]+')AA        
      ' 

    EXEC SP_EXECUTESQL @QRY 

    -- Fetches next record and increments the loop 
    FETCH NEXT FROM CUR 
    INTO @TABLENAME,@COLUMNNAME 
END 

CLOSE CUR; 
DEALLOCATE CUR; 
+0

Получил ли результат? @Touhid K. –

+0

Я сделал это с таблицами TEMP. Пожалуйста, проверьте ответ, указанный мной. :) Спасибо за вашу помощь. :) –

0

здесь то, что вы можете сделать

declare @name varchar(50), 
     @column varchar(50), 
     @query varchar(max) 

declare @table table(TableName varchar(50), 
        MaxDate datetime) 

declare c cursor for 
-- your query here 
SELECT DISTINCT a.srcTblName, a.SrcDateColName 
FROM t1 a 
LEFT JOIN t2 b 
ON a.srcFileName LIKE b.FileName 
WHERE a.srcTblName is NOT NULL 
AND a.srcFileName is NOT NULL 

open c 
fetch next from c into @name,@column 
while @@fetch_status=0 
begin 
    -- executing the code for each table mentioned in your srcTblName 
    set @query='select ''' + @name + ''' as TableName,max(' + @column + ') as Date from ' + @name 
    --print @query 
    insert into @table(TableName,MaxDate) 
    exec(@query) 
    fetch next from c into @name,@column 
end 
close c 
deallocate c 

select * from @table 

здесь работает DEMO

надеюсь, что это поможет вам