2014-12-18 4 views
0

У меня есть следующая таблица с разделом месяца и года, в который я хотел бы присоединиться, чтобы создать дату (поскольку у меня нет дня, когда это может быть установлено на первое)Извлечь данные за 2 года и конвертировать число в месяц

 
Measurement mm yyyy 
15000 1 2014 
16000 2 2014 
15000 5 2013 
16000 3 2014 
15000 4 2014 
16000 5 2014 
15000 6 2013 
16000 7 2012 

поэтому я хотел бы вывод как:

15000 01/01/2014 
16000 01/02/2014 

т.д.

только в течение последних 2-х лет.

Возможно ли это?

Благодаря

ответ

0
SELECT Measurement,DT FROM 
(
    SELECT Measurement,DENSE_RANK() OVER(ORDER BY YYYY DESC) RNK, 
    CONVERT(varchar(11),'01'+'/'+CAST(MM AS VARCHAR(2))+'/'+CAST(YYYY AS VARCHAR(4)),103) DT 
    FROM #TEMP 
)TAB 
WHERE RNK IN(1,2) 

UPDATE

Я обновляю в соответствии с вашим новым требованием

Здесь мы получим весь месяц и LEFT JOIN с вами таблицей

;WITH CTE1 AS 
(
    SELECT 1 ID, CAST('01/01/2013' AS DATE) DT 
    UNION ALL 
    SELECT ID+1,DATEADD(MONTH,1,DT) FROM CTE1 
    WHERE ID<12 
) 
SELECT ID,DATENAME(MONTH,DT) [MONTH],TP.*, 
DENSE_RANK() OVER(ORDER BY YYYY DESC) RNK 
INTO #NEWTABLE 
FROM CTE1 
LEFT JOIN TEMP TP ON CAST(TP.MM AS NUMERIC(3,0)) = CAST(CTE1.ID AS NUMERIC(3,0)) 

Теперь мы объявляем 2 переменные, первые переменное, чтобы получить значение, чтобы показать строки месяца как столбцы и второй заменить NULL with zero

DECLARE @cols NVARCHAR (MAX) 
DECLARE @NullToZeroCols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + [MONTH] + ']', 
       '[' + [MONTH] + ']') 
       FROM (SELECT DISTINCT ID,[MONTH] FROM #NEWTABLE) PV 
       ORDER BY ID 

SET @NullToZeroCols = SUBSTRING((SELECT ',ISNULL(['+[MONTH]+'],0) AS ['+[MONTH]+']' 
FROM(SELECT DISTINCT [MONTH],ID FROM #NEWTABLE GROUP BY [MONTH],ID)TAB 
ORDER BY ID FOR XML PATH('')),2,8000) 

Теперь мы выбираем последние два года в таблице и поворачивать его

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT yyyy,' + @NullToZeroCols + ' FROM 
      (
       SELECT yyyy, [MONTH], Measurement FROM #NEWTABLE 
       WHERE RNK IN(1,2) 
      ) x 
      PIVOT 
      (
       SUM(Measurement) 
       FOR [MONTH] IN (' + @cols + ') 
      ) p 
       WHERE yyyy IS NOT NULL 
       ORDER BY yyyy;' 

EXEC SP_EXECUTESQL @query 
+0

Могу ли я спросить, действительно ли это действительная дата после ее преобразования? – user1824963

+0

Да. Для безопасности вы можете использовать CAST (DT AS DATE) @ user1824963 –

+0

Большое спасибо, но кажется, что Visual Studio не признает это как дату? Извините, не знаю, что вы подразумеваете под CAST (DT AS Date) – user1824963

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