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
Могу ли я спросить, действительно ли это действительная дата после ее преобразования? – user1824963
Да. Для безопасности вы можете использовать CAST (DT AS DATE) @ user1824963 –
Большое спасибо, но кажется, что Visual Studio не признает это как дату? Извините, не знаю, что вы подразумеваете под CAST (DT AS Date) – user1824963