stuff one concatenate column sql group-by sql-server-2000 max coalesce

column - sql server concatenate rows in one row



SQL-CombinaciĆ³n fea de GROUP BY y COALESCE (4)

No tan elegante, pero para ti pobres almas de SQL 2000:

SELECT T1.State, T2.Foo, T1.LastUpdated FROM ( SELECT State, MAX([ID]) AS [ID], MAX(COALESCE(DateUpdated, DateCreated)) AS LastUpdated FROM YourTable GROUP BY State HAVING COUNT(DISTINCT Foo) = 1 ) T1 INNER JOIN YourTable T2 ON T1.State = T2.State AND T1.[ID] = T2.[ID]

Tengo una tabla con datos similares a los siguientes:

[ID], [Estado], [foo], [DateCreated], [DateUpdated]

Cuanto más trabajo en esto, más desagradable es mi SQL, lo que me dice que probablemente estoy haciendo algo mal. Lo que quiero es una lista única de cada estado siempre y cuando foo sea siempre el mismo para ese estado (si foo no es el mismo para todos los registros en ese estado, no quiero ese estado en absoluto) . Además, deseo COALESCE DateCreated y DateUpdated y quiero el valor máximo para ese estado.

Entonces, dados estos datos:

[ID], [State], [foo], [DateCreated], [DateUpdated] 1, MA, data1, 05/29/2012, 06/02/2012 2, MA, data1, 05/29/2012, 06/03/2012 3, RI, data2, 05/29/2012, NULL 4, RI, data3, 05/29/2012, NULL 5, NH, data4, 05/29/2012, NULL 6, NH, data4, 05/29/2012, 06/05/2012

Me gustaría solo estos resultados:

[State], [foo], [LastUpdated] MA, data1, 06/03/2012 NH, data4, 06/05/2012

¿Cuál es la forma más elegante de obtener lo que busco?


Otro:

http://sqlfiddle.com/#!6/fd219/1

SELECT t.State, MAX(t.foo), MAX( COALESCE( t.DateUpdated, t.DateCreated )) FROM t GROUP BY t.State HAVING COUNT(DISTINCT t.foo) = 1;


Suponiendo que está utilizando SQL Server 2005 o>

Prueba esto:

WITH Data AS ( SELECT *, COALESCE([DateCreated], [DateUpdated]) AS LastUpdated, ROW_NUMBER() OVER(PARTITION BY State ORDER BY COALESCE([DateCreated], [DateUpdated]) DESC) Position FROM <YOUR-TABLE> a WHERE NOT EXISTS ( SELECT 1 FROM <YOUR-TABLE> b WHERE a.State = b.State AND a.foo <> b.foo ) ) SELECT State, foo, LastUpdated FROM Data WHERE Positon = 1


Un simple Group by con consultas anidadas debería ser suficiente:

Select State, coalesce(max_created,max_updated) from ( Select State, min(foo) as min_foo, max(foo) as max_foo, max(DateCreated) as max_created, max(DateUpdated) as max_updated From Data Group by State) Where min_foo = max_foo