Author |
Topic |
ibbo14
Starting Member
10 Posts |
Posted - 2014-10-21 : 22:27:21
|
Hi SQL experts,I am currently working on an export view for a client and they have requested for a pivot with an additional column followed by the first pivot column in order to add an extra detail.What I have is this: SAMPLE_TAG SAMPLE_TYPE LAB_METHOD LAB_ELEMENT LAB_RESULT_NUMERICMCR0004140 OR ME-MS41 Ag 0.03MCR0004140 OR ME-MS41 Au -0.2MCR0004140 OR ME-MS41 Cu 15.3MCR0004140 OR ME-MS41 Zn 19MCR0005015 OR AG-OG46 Ag 421MCR0005015 OR ME-MS41 Au -0.2MCR0005015 OR ME-MS41 Cu 30.7MCR0005015 OR ME-MS41 Zn 15I want to achieve this:SAMPLE_TAG SAMPLE_TYPE Ag Ag_Method Au Au_Method Cu Cu_Method Zn Zn_MethodMCR0004140 OR 0.03 ME-MS41 -0.2 ME-MS41 15.3 ME-MS41 19 ME-MS41MCR0005015 OR 421 AG-OG46 -0.2 ME-MS41 30.7 ME-MS41 15 ME-MS41 I can get the first pivot to work using the following:SELECT *FROM TEMP_PIVOTPIVOT ( MAX(LAB_RESULT_NUMERIC) FOR LAB_ELEMENT IN ( [Au],[Ag],[Cu],[Zn],[Pt]) ) AS RESULTHowever, this is where I get stuck.Any help or suggestions would be greatly appreciated. I have attached the create table / insert scripts below:Thanks :) ----------------------- CREATE TABLE [dbo].[TEMP_PIVOT]( [LAB_ID] [nvarchar](12) NOT NULL, [DESPATCH_ID] [nvarchar](30) NULL, [LAB_JOB_NO] [nvarchar](20) NULL, [PROJECT] [nvarchar](16) NULL, [SITE_ID] [nvarchar](16) NULL, [SAMPLE_TAG] [nvarchar](16) NULL, [SAMPLE_TYPE] [nvarchar](8) NULL, [LAB_METHOD] [nvarchar](30) NOT NULL, [LAB_ELEMENT] [nvarchar](8) NULL, [LAB_RESULT_NUMERIC] [float] NULL) ON [PRIMARY]INSERT [dbo].[TEMP_PIVOT] ([LAB_ID], [DESPATCH_ID], [LAB_JOB_NO], [PROJECT], [SITE_ID], [SAMPLE_TAG], [SAMPLE_TYPE], [LAB_METHOD], [LAB_ELEMENT], [LAB_RESULT_NUMERIC]) VALUES (N'ALS_MDZ', N'MIR00717', N'AN14036339', N'GORBEA', N'POINT_SAMPLE', N'MCR0004140', N'OR', N'ME-MS41', N'Ag', 0.03)INSERT [dbo].[TEMP_PIVOT] ([LAB_ID], [DESPATCH_ID], [LAB_JOB_NO], [PROJECT], [SITE_ID], [SAMPLE_TAG], [SAMPLE_TYPE], [LAB_METHOD], [LAB_ELEMENT], [LAB_RESULT_NUMERIC]) VALUES (N'ALS_MDZ', N'MIR00717', N'AN14036339', N'GORBEA', N'POINT_SAMPLE', N'MCR0004140', N'OR', N'ME-MS41', N'Au', -0.2)INSERT [dbo].[TEMP_PIVOT] ([LAB_ID], [DESPATCH_ID], [LAB_JOB_NO], [PROJECT], [SITE_ID], [SAMPLE_TAG], [SAMPLE_TYPE], [LAB_METHOD], [LAB_ELEMENT], [LAB_RESULT_NUMERIC]) VALUES (N'ALS_MDZ', N'MIR00717', N'AN14036339', N'GORBEA', N'POINT_SAMPLE', N'MCR0004140', N'OR', N'ME-MS41', N'Cu', 15.3)INSERT [dbo].[TEMP_PIVOT] ([LAB_ID], [DESPATCH_ID], [LAB_JOB_NO], [PROJECT], [SITE_ID], [SAMPLE_TAG], [SAMPLE_TYPE], [LAB_METHOD], [LAB_ELEMENT], [LAB_RESULT_NUMERIC]) VALUES (N'ALS_MDZ', N'MIR00717', N'AN14036339', N'GORBEA', N'POINT_SAMPLE', N'MCR0004140', N'OR', N'ME-MS41', N'Zn', 19)INSERT [dbo].[TEMP_PIVOT] ([LAB_ID], [DESPATCH_ID], [LAB_JOB_NO], [PROJECT], [SITE_ID], [SAMPLE_TAG], [SAMPLE_TYPE], [LAB_METHOD], [LAB_ELEMENT], [LAB_RESULT_NUMERIC]) VALUES (N'ALS_MDZ', N'MIR00717', N'AN14036339', N'GORBEA', N'POINT_SAMPLE', N'MCR0005015', N'OR', N'AG-OG46', N'Ag', 421)INSERT [dbo].[TEMP_PIVOT] ([LAB_ID], [DESPATCH_ID], [LAB_JOB_NO], [PROJECT], [SITE_ID], [SAMPLE_TAG], [SAMPLE_TYPE], [LAB_METHOD], [LAB_ELEMENT], [LAB_RESULT_NUMERIC]) VALUES (N'ALS_MDZ', N'MIR00717', N'AN14036339', N'GORBEA', N'POINT_SAMPLE', N'MCR0005015', N'OR', N'ME-MS41', N'Au', -0.2)INSERT [dbo].[TEMP_PIVOT] ([LAB_ID], [DESPATCH_ID], [LAB_JOB_NO], [PROJECT], [SITE_ID], [SAMPLE_TAG], [SAMPLE_TYPE], [LAB_METHOD], [LAB_ELEMENT], [LAB_RESULT_NUMERIC]) VALUES (N'ALS_MDZ', N'MIR00717', N'AN14036339', N'GORBEA', N'POINT_SAMPLE', N'MCR0005015', N'OR', N'ME-MS41', N'Cu', 30.7)INSERT [dbo].[TEMP_PIVOT] ([LAB_ID], [DESPATCH_ID], [LAB_JOB_NO], [PROJECT], [SITE_ID], [SAMPLE_TAG], [SAMPLE_TYPE], [LAB_METHOD], [LAB_ELEMENT], [LAB_RESULT_NUMERIC]) VALUES (N'ALS_MDZ', N'MIR00717', N'AN14036339', N'GORBEA', N'POINT_SAMPLE', N'MCR0005015', N'OR', N'ME-MS41', N'Zn', 15) |
|
malpashaa
Constraint Violating Yak Guru
264 Posts |
Posted - 2014-10-21 : 23:15:09
|
Try something like this:-- Using PIVOTSELECT T.SAMPLE_TAG, T.SAMPLE_TYPE, T.Ag, T2.Ag AS Ag_Method, T.Au, T2.Au AS Au_Method, T.Cu, T2.Cu AS Cu_Method, T.Zn, T2.Zn AS Zn_Method FROM (SELECT SAMPLE_TAG, SAMPLE_TYPE, Ag, Au, Cu, Zn FROM (SELECT SAMPLE_TAG, SAMPLE_TYPE, LAB_RESULT_NUMERIC, LAB_ELEMENT FROM TEMP_PIVOT) AS T PIVOT(MAX(LAB_RESULT_NUMERIC) FOR LAB_ELEMENT IN([Au],[Ag],[Cu],[Zn])) AS RESULT) AS T INNER JOIN (SELECT SAMPLE_TAG, SAMPLE_TYPE, Ag, Au, Cu, Zn FROM (SELECT SAMPLE_TAG, SAMPLE_TYPE, LAB_METHOD, LAB_ELEMENT FROM TEMP_PIVOT) AS T PIVOT(MAX(LAB_METHOD) FOR LAB_ELEMENT IN([Au],[Ag],[Cu],[Zn])) AS RESULT) AS T2 ON T2.SAMPLE_TAG = T.SAMPLE_TAG AND T2.SAMPLE_TYPE = T.SAMPLE_TYPE;-- Another way using GROUP BY and should be fasterSELECT T.SAMPLE_TAG, T.SAMPLE_TYPE, MAX(CASE WHEN T.LAB_ELEMENT = N'Ag' THEN T.LAB_RESULT_NUMERIC ELSE NULL END) AS Ag, MAX(CASE WHEN T.LAB_ELEMENT = N'Ag' THEN T.LAB_METHOD ELSE NULL END) AS Ag_Method, MAX(CASE WHEN T.LAB_ELEMENT = N'Au' THEN T.LAB_RESULT_NUMERIC ELSE NULL END) AS Au, MAX(CASE WHEN T.LAB_ELEMENT = N'Au' THEN T.LAB_METHOD ELSE NULL END) AS Au_Method, MAX(CASE WHEN T.LAB_ELEMENT = N'Cu' THEN T.LAB_RESULT_NUMERIC ELSE NULL END) AS Cu, MAX(CASE WHEN T.LAB_ELEMENT = N'Cu' THEN T.LAB_METHOD ELSE NULL END) AS Cu_Method, MAX(CASE WHEN T.LAB_ELEMENT = N'Zn' THEN T.LAB_RESULT_NUMERIC ELSE NULL END) AS Zn, MAX(CASE WHEN T.LAB_ELEMENT = N'Zn' THEN T.LAB_METHOD ELSE NULL END) AS Zn_Method FROM TEMP_PIVOT AS T GROUP BY T.SAMPLE_TAG, T.SAMPLE_TYPE; For us, there is only the trying. The rest is not our business. ~T.S. EliotMuhammad Al Pasha |
|
|
ibbo14
Starting Member
10 Posts |
Posted - 2014-10-21 : 23:21:46
|
Thanks for the reply malpashaa, I'll give that a go and let you know shortly. |
|
|
ibbo14
Starting Member
10 Posts |
Posted - 2014-10-22 : 00:44:23
|
Hi Muhammad,I got it going using the group by approach, you are right about it being much faster.Thank you very much for your help :) |
|
|
ElenaSTL
Starting Member
10 Posts |
Posted - 2014-10-23 : 14:43:33
|
Malpashaa,what is the purpose to put N before the element's name? like:WHEN T.LAB_ELEMENT = N'Ag'It works the same way without N. |
|
|
|
|
|