2014-12-15 2 views
8

У меня есть таблица типа.Как выбрать разные значения строк в разных столбцах

ID Date   Value 
1 12/12/2014 A 
1 24/12/2014 T 
2 13/12/2014 A 
2 23/12/2014 T 
3 12/03/2014 A 
3 12/04/2014 T 
4 12/12/2014 T 
5 12/04/2014 T 

И я хочу привести как где ADate является датой, когда значение является и TDate является датой, когда значение T

ID ADate   TDate 
1  12/12/2014  24/12/2014 
2  13/12/2014  23/12/2014 
3  12/03/2014  12/04/2014 
4   -   12/12/2014 
5   -   12/04/2014 
+0

@NoIdeaForName Как это должно работать? –

+1

@RaduGheorghiu хорошо, с данной информацией, вот и все, что я могу предоставить –

+1

@NoIdeaForName Если вы пытаетесь помочь OP, просто попросите более подробную информацию. И если вы намерены троллить хотя бы, убедитесь, что ваш запрос не возвращает синтаксическую ошибку. –

ответ

3

conditional Aggregate. Попробуйте

SELECT id, 
     Min(CASE 
      WHEN value = 'A' THEN [Date] 
      END) Adate, 
     Max(CASE 
      WHEN value = 'T' THEN [Date] 
      END) Tdate 
FROM Tablename 
GROUP BY id 

Update: Чтобы получить строки с одинаковым идентификатором

DECLARE @cnt INT 

SELECT TOP 1 @cnt = Count(1)/2 
FROM #test 
GROUP BY id 
ORDER BY Count(1)/2 DESC 

SELECT id, 
     Min(CASE 
      WHEN value = 'A' THEN [Date] 
      END) Adate, 
     Max(CASE 
      WHEN value = 'T' THEN [Date] 
      END) Tdate 
FROM (SELECT Row_number() 
       OVER (
        partition BY id, value 
        ORDER BY date)%@cnt rn, 
       * 
     FROM #test) a 
GROUP BY id,rn 
+0

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

+0

@Rain Затем добавьте образцы данных и ожидаемый результат соответственно !! –

+0

добавлено больше данных – Niar

3

вы можете использовать оператор WHERE и JOIN заявление, чтобы получить:

SELECT a.id, a.date AS ADate, b.date AS TDate 
FROM table a 
JOIN table b on a.id = b.id and b.value = 'T' 
WHERE a.value = 'A' 

гДЕ заявление убедитесь, что ADate приходит из строки, где value='A'.

инструкция JOIN убедитесь, что TDate исходит из строки, где value='T'.

0

один больше вариант с рейтинговой функции ROW_NUMBER

;WITH cte AS 
(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY id ORDER BY [date]) AS rn 
    FROM dbo.test103 t 
) 
    SELECT c.id, c.[date] AS ADate, c2.[date] AS TDate 
    FROM cte c LEFT JOIN cte c2 ON c.Id = c2.Id AND c.rn = c2.rn - 1 AND c.Value != c2.Value 
    WHERE c.value = 'A' 
Смежные вопросы