i have the following data in SQL 2017
Number Description Value 37 Recorded 2019-11-06T10:51:25.482-05:00 37 ICD10Code Z32.00 37 ICD10Desc Encounter 37 Status Inactive 37 Recorded 2019-12-06T10:51:25.482-05:00 37 ICD10Code T11.00 37 ICD10Desc Test 37 Status Active
however i am new to pivot in sql and i tried different ways and not successful with the result i want it. below is the data i want, can someone please help to provide to achieve this.
Number Recorded ICD10Code ICD10Desc Status 37 2019-11-06T10:51:25.482-05:00 Z32.00 Encounter Inactive 37 2019-12-06T10:51:25.482-05:00 T11.00 Test Active
i tried with following query
select * from ( select patientnumber,description,value from patient_Diagnosis where (Description not like '%guid%' and description not like '%listorder%') and type != 0 and type =1 and description != 'statusdate' and patientnumber = 946 ) src pivot ( MIN(value) FOR Description IN([Recorded],[ICD10COde],[ICD10Desc]) ) piv;
Advertisement
Answer
Hi and thanks for updating.
I created a temporary table named #_tmp and loaded it with all the data that you had in those screenshots.
Input:
SELECT * FROM #_tmp
Output:
Number Description Value 946 Recorded 2019-07-11 946 ICD10Code F11.10 946 ICD10Desc Opioid abuse, uncomplicated 946 Status Resolved 946 Recorded 2019-05-02 946 ICD10Code F10.20 946 ICD10Desc Alcohol use disorder, Moderate 946 Status Resolved
Anyway, here’s the pivot. It uses a Common Table Expression to put a row_number() on each description and value.
;WITH tmpCTE AS (
SELECT X.*
, ROW_NUMBER() OVER(PARTITION BY X.[Description] ORDER BY X.[Number], X.[Description], X.[Value]) as [rn]
FROM #_tmp as X
)
SELECT pvt.[Number], pvt.[Recorded], pvt.[ICD10Code], pvt.[ICD10Desc], pvt.[Status]
FROM (
SELECT T.[Number], T.[Description], T.[Value], T.[rn]
FROM tmpCTE AS T
) AS p
PIVOT (
-- You will have to know the distinct names of the values for the columns
-- In this case, it is all the unique items from the Description column
-- Since that is what we're pivoting.
MAX([Value]) FOR [Description] IN ([Recorded], [ICD10Code], [ICD10Desc], [Status])
) as pvt
GROUP BY pvt.[rn], pvt.[Number], pvt.[Recorded], pvt.[ICD10Code], pvt.[ICD10Desc], pvt.[Status]
ORDER BY pvt.[Number], pvt.[Recorded] DESC
Output:
Number Recorded ICD10Code ICD10Desc Status 946 2019-07-11 F11.10 Opioid abuse, uncomplicated Resolved 946 2019-05-02 F10.20 Alcohol use disorder, Moderate Resolved
Note that if we just run the CTE:
SELECT X.* , ROW_NUMBER() OVER(PARTITION BY X.[Description] ORDER BY X.[Number], X.[Description], X.[Value]) as [rn] FROM #_tmp as X
We get the following. You can see the alternating rn values to indicate groupings when pivoted. That helps keep things in order for our output.
Output:
Number Description Value rn 946 ICD10Code F10.20 1 946 ICD10Code F11.10 2 946 ICD10Desc Alcohol use disorder, Moderate 1 946 ICD10Desc Opioid abuse, uncomplicated 2 946 Recorded 2019-05-02 1 946 Recorded 2019-07-11 2 946 Status Resolved 1 946 Status Resolved 2