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