2013-04-04 2 views
1
ID Date1 T1 Date2 T2 Date3 T3 Date4 T4 
1 DT11  Y ----------NULL----------------------- 
2 DT11  N DT22 Y ----------NULL---------- 
3 DT31  N DT32 Y DT33 Y --NULL----- 
4 ----NULL--- DT42 Y ---NULL--- DT44 Y 
5 DT51  Y ---NULL-- DT53 Y --NULL----- 

У меня есть таблица Table1 с вышеуказанной структурой.Построить запрос T-SQL по следующему требованию

Требования:

  1. Проверьте, какой из (Т1 - Т5) имеет «Y» в нем
  2. Если несколько «Y», сравнить даты, чтобы получить самую последнюю дату
  3. Задайте значение в новом поле с именем или частью имени поля даты с самой последней датой.

Итак, о/р должен быть

ID Most-recent-Date-Flag 
---------------------------------------------------  
1 "Date1 or T1" -> Since all others are null 
2 "Date2 or T2" -> T2 has 'Y' 
3 "Date3 or T3" -> one 'N' and multiple 'Y', DT33 is most recent 
4 "Date4 or T4" -> multiple 'Y', DT44 is most recent 
5 "Date5 or T5" -> multiple 'Y', DT53 is most recent 

мне удалось создать запрос для сравнения дат. Она заключается в следующем:

SELECT [ID] 
    , MAX(UNPIVOT_DATE) AS MOST_RECENT_DATE 
    FROM 
    (
    SELECT 
    [ID] 
    ,[Date1] 
    ,[Date2] 
    ,[Date3] 
    ,[Date4] 
    FROM TABLE1 
    )SRC_TABLE 
    UNPIVOT 
    (
    UNPIVOT_DATE 
    FOR DATES IN 
    (
    [Date1] 
    ,[Date2] 
    ,[Date3] 
    ,[Date4] 
    ) 
    )UNPIVOT_TABLE 
    GROUP BY [ID] 

Я застрял в точке, где я проверить на «Y» в (T1-T4) полей и получить имя столбца самой последней даты после сравнения.

Надеюсь, это объяснение поможет!

08/04/2013
Спасибо большое @MarcinJuraszek. Оно работает!! В любом случае, я могу передать имя столбца поля (T1-T4) тоже? Я попробовал следующее, и это не сработало.

SELECT t.[ID] 
,MAX(t.Date) as MOST_RECENT_DATE 
--,t.Column_Name 
FROM 
(
    SELECT [ID] 
    ,[Date1] as Date 
    ,[T1] as T 
-- ,COL_NAME(OBJECT_ID('Table1'), 2) AS Column_Name 
    FROM Table1 
UNION ALL 
    SELECT [ID] 
    ,[Date2] as Date 
    ,[T2] as T 
-- ,COL_NAME(OBJECT_ID('Table1'), 4) AS Column_Name 
    FROM Table1 
    UNION ALL 
    SELECT [ID] 
    ,[Date3] as Date 
    ,[T3] as T 
-- ,COL_NAME(OBJECT_ID('Table1'), 6) AS Column_Name 
    FROM Table1 
    UNION ALL 
    SELECT [ID] 
    ,[Date4] as Date 
    ,[T4] as T 
-- ,COL_NAME(OBJECT_ID('Table1'), 8) AS Column_Name 
    FROM Table1 
) t 
WHERE t.T = 'Y' 
GROUP BY t.[ID] 
--, t.Column_Name 
ORDER by [ID] 
+0

Добро пожаловать в StackOverflow: если вы отправляете код, XML или образцы данных, ** пожалуйста ** выделите эти строки в текстовом редакторе и нажмите кнопку «образцы кода» ('{}') на панели инструментов редактора для красивого формата и синтаксиса выделите это! –

+0

спасибо marc_s! Я первый таймер здесь ... не знал, как это сделать! :) – user2243262

+0

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

ответ

0

Как об этом:

SELECT t.ID, MAX(t.Date) FROM 
    (SELECT ID, Date1 as Date, T1 as T FROM Test 
    UNION ALL 
    SELECT ID, Date2 as Date, T2 as T FROM Test 
    UNION ALL 
    SELECT ID, Date3 as Date, T3 as T FROM Test 
    UNION ALL 
    SELECT ID, Date4 as Date, T4 as T FROM Test) t 
WHERE t.T = 'Y' 
GROUP BY t.ID 

Simple Demo

0

В качестве альтернативы GROUP BY + MAX(), вы могли бы использовать CROSS APPLY (SELECT TOP 1). Это позволит вам возвращать другие данные вместе с максимальной датой:

SELECT 
    t.*, 
    x.Date, 
    x.FlagName 
FROM TABLE1 AS t 
CROSS APPLY (
    SELECT TOP 1 
    Date, 
    FlagName 
    FROM (
    SELECT Date1, T1, 'T1' UNION ALL 
    SELECT Date2, T2, 'T2' UNION ALL 
    SELECT Date3, T3, 'T3' UNION ALL 
    SELECT Date4, T4, 'T4' UNION ALL 
    SELECT Date5, T5, 'T5' 
) AS s (Date, T, FlagName) 
    WHERE T = 'Y' 
    ORDER BY Date 
) AS x 
; 
0

я, наконец, в конечном итоге с помощью следующего запроса (случайно), и он работал .....

  1. Я создал вид, как указано ниже

    CREATE VIEW View_Test, как выберите [ID], случай, когда [Т1] = 'Y', то [D1] еще нулевой конец как [D1], случай, когда [T2] = «Y 'then [D2] else null end как [D2],случай, когда [Т3] = 'Y', то [D3] еще нулевой конец как [D3], случай, когда [T4] = 'Y', то [D4] еще нулевой конец как [D4] из теста

Тогда я использовал представление в качестве UNPIVOT запроса, как указано ниже

select [ID], max(DATE_FIELD) as most_recent_date, max(Flag) as most_recent_flag 
from View_Test 
unpivot (
DATE_FIELD for Flag in 
(
[D1] 
, [D2] 
, [D3] 
,[D4] 
) 
) as DATE_Unpivoted 
group by [ID] 
ORDER BY [ID] 

Когда я выполнил выше запрос, то «макс (флаг)» дал мне имя дата-поле, которое было самым последним Дата. Я до сих пор не знаю, как это работает. Этот бит о «флагове» до сих пор не понятен мне.Но я оставил его в запросе случайно ... скопируйте и вставьте из другого запроса, который я пробовал и не работал :)

Может кто-нибудь просветить пожалуйста? :)

Смежные вопросы