Nombres de campo que contengan valores

26/05/2009 - 22:35 por David | Informe spam
Microsoft SQL Server 2000, con todos los Services Pack

Muy buenas, como era de esperar no se ni por donde cogerlo, este es el
escenario

TablaDatos

[id]: clave principal
[c1]: decimal permite NULL
[c2]: decimal permite NULL
[c3]: decimal permite NULL
[c4]: decimal permite NULL


más campos (no interesan para "el problema", filtraré por ellos)

¿Cómo implementar la siguiente consulta?

Devuelve los nombres de los campos c1, c2, c3, c4 siempre y cuando en el
conjunto de los valores devueltos por la consulta una columna no tenga
ningún valor NULL.

¿qué dice, que pregunta?

Veamoslo con ejemplos

c1 c2 c3 c4
null 12 13 11
11 7 22 34
14 14 3 4

La consulta para este conjunto de valores FILTARDOS deberái devolver:
LA RESPUESTA ES: c2,c3,c4

c1 c2 c3 c4
null 12 13 11
11 null 22 34
14 null 3 4

La consulta para este conjunto de valores FILTARDOS deberái devolver:
LA RESPUESTA ES:c3,c4


c1 c2 c3 c4
null 12 13 11
11 7 22 34
14 14 3 null

La consulta para este conjunto de valores devueltos FILTARDOS deberái
devolver:
LA RESPUESTA ES: c2,c3



De antemano muchas gracias

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
26/05/2009 - 23:16 | Informe spam
David,

Trata:

DECLARE @t TABLE (
c1 INT,
c2 INT,
c3 INT,
c4 INT
);

INSERT INTO @t VALUES ( NULL, 12, 13, 11 );
INSERT INTO @t VALUES ( 11, 7, 22, 34 );
INSERT INTO @t VALUES ( 14, 14, 3, 4 );

WITH r_set
AS
(
SELECT
COUNT(c1) AS cnt_c1,
COUNT(c2) AS cnt_c2,
COUNT(c3) AS cnt_c3,
COUNT(c4) AS cnt_c4,
COUNT(*) AS cnt
FROM
(SELECT 1 AS c0, c1, c2, c3, c4 FROM @t) AS t
GROUP BY
c0
)
SELECT
REVERSE(
STUFF(
REVERSE(
CASE WHEN cnt_c1 = cnt THEN 'c1,' ELSE '' END +
CASE WHEN cnt_c2 = cnt THEN 'c2,' ELSE '' END +
CASE WHEN cnt_c3 = cnt THEN 'c3,' ELSE '' END +
CASE WHEN cnt_c4 = cnt THEN 'c4,' ELSE '' END
), 1, 1, '')
) AS c0
FROM
r_set;
GO


AMB


"David" wrote:

Microsoft SQL Server 2000, con todos los Services Pack

Muy buenas, como era de esperar no se ni por donde cogerlo, este es el
escenario

TablaDatos

[id]: clave principal
[c1]: decimal permite NULL
[c2]: decimal permite NULL
[c3]: decimal permite NULL
[c4]: decimal permite NULL

.
más campos (no interesan para "el problema", filtraré por ellos)

¿Cómo implementar la siguiente consulta?

Devuelve los nombres de los campos c1, c2, c3, c4 siempre y cuando en el
conjunto de los valores devueltos por la consulta una columna no tenga
ningún valor NULL.

¿qué dice, que pregunta?

Veamoslo con ejemplos

c1 c2 c3 c4
null 12 13 11
11 7 22 34
14 14 3 4

La consulta para este conjunto de valores FILTARDOS deberái devolver:
LA RESPUESTA ES: c2,c3,c4

c1 c2 c3 c4
null 12 13 11
11 null 22 34
14 null 3 4

La consulta para este conjunto de valores FILTARDOS deberái devolver:
LA RESPUESTA ES:c3,c4


c1 c2 c3 c4
null 12 13 11
11 7 22 34
14 14 3 null

La consulta para este conjunto de valores devueltos FILTARDOS deberái
devolver:
LA RESPUESTA ES: c2,c3



De antemano muchas gracias




Respuesta Responder a este mensaje
#2 Alejandro Mesa
26/05/2009 - 23:19 | Informe spam
Menos complicado.

DECLARE @t TABLE (
c1 INT,
c2 INT,
c3 INT,
c4 INT
);

INSERT INTO @t VALUES ( NULL, 12, 13, 11 );
INSERT INTO @t VALUES ( 11, 7, 22, 34 );
INSERT INTO @t VALUES ( 14, 14, 3, 4 );

WITH r_set
AS
(
SELECT
COUNT(c1) AS cnt_c1,
COUNT(c2) AS cnt_c2,
COUNT(c3) AS cnt_c3,
COUNT(c4) AS cnt_c4,
COUNT(*) AS cnt
FROM
(SELECT 1 AS c0, c1, c2, c3, c4 FROM @t) AS t
GROUP BY
c0
)
SELECT
STUFF(
CASE WHEN cnt_c1 = cnt THEN ',c1' ELSE '' END +
CASE WHEN cnt_c2 = cnt THEN ',c2' ELSE '' END +
CASE WHEN cnt_c3 = cnt THEN ',c3' ELSE '' END +
CASE WHEN cnt_c4 = cnt THEN ',c4' ELSE '' END , 1, 1, '') AS c0
FROM
r_set;
GO


AMB



"Alejandro Mesa" wrote:

David,

Trata:

DECLARE @t TABLE (
c1 INT,
c2 INT,
c3 INT,
c4 INT
);

INSERT INTO @t VALUES ( NULL, 12, 13, 11 );
INSERT INTO @t VALUES ( 11, 7, 22, 34 );
INSERT INTO @t VALUES ( 14, 14, 3, 4 );

WITH r_set
AS
(
SELECT
COUNT(c1) AS cnt_c1,
COUNT(c2) AS cnt_c2,
COUNT(c3) AS cnt_c3,
COUNT(c4) AS cnt_c4,
COUNT(*) AS cnt
FROM
(SELECT 1 AS c0, c1, c2, c3, c4 FROM @t) AS t
GROUP BY
c0
)
SELECT
REVERSE(
STUFF(
REVERSE(
CASE WHEN cnt_c1 = cnt THEN 'c1,' ELSE '' END +
CASE WHEN cnt_c2 = cnt THEN 'c2,' ELSE '' END +
CASE WHEN cnt_c3 = cnt THEN 'c3,' ELSE '' END +
CASE WHEN cnt_c4 = cnt THEN 'c4,' ELSE '' END
), 1, 1, '')
) AS c0
FROM
r_set;
GO


AMB


"David" wrote:

> Microsoft SQL Server 2000, con todos los Services Pack
>
> Muy buenas, como era de esperar no se ni por donde cogerlo, este es el
> escenario
>
> TablaDatos
>
> [id]: clave principal
> [c1]: decimal permite NULL
> [c2]: decimal permite NULL
> [c3]: decimal permite NULL
> [c4]: decimal permite NULL
>
> .
> más campos (no interesan para "el problema", filtraré por ellos)
>
> ¿Cómo implementar la siguiente consulta?
>
> Devuelve los nombres de los campos c1, c2, c3, c4 siempre y cuando en el
> conjunto de los valores devueltos por la consulta una columna no tenga
> ningún valor NULL.
>
> ¿qué dice, que pregunta?
>
> Veamoslo con ejemplos
>
> c1 c2 c3 c4
> null 12 13 11
> 11 7 22 34
> 14 14 3 4
>
> La consulta para este conjunto de valores FILTARDOS deberái devolver:
> LA RESPUESTA ES: c2,c3,c4
>
> c1 c2 c3 c4
> null 12 13 11
> 11 null 22 34
> 14 null 3 4
>
> La consulta para este conjunto de valores FILTARDOS deberái devolver:
> LA RESPUESTA ES:c3,c4
>
>
> c1 c2 c3 c4
> null 12 13 11
> 11 7 22 34
> 14 14 3 null
>
> La consulta para este conjunto de valores devueltos FILTARDOS deberái
> devolver:
> LA RESPUESTA ES: c2,c3
>
>
>
> De antemano muchas gracias
>
>
>
>
Respuesta Responder a este mensaje
#3 Alejandro Mesa
26/05/2009 - 23:23 | Informe spam
Olvide dar una breve explicacion sobre el metodo usado.

Este metodo se basa principalmente en que la mayoria de las funciones de
agregacion no toman en cuenta los valores NULL, asi que count(c1) contara las
filas cuyo valor de [c1] no es null, mientras que count(*) cuenta todas las
filas y no esta atada a ninguna columna, por lo que si count(c1) = count(*)
entonces todas las filas tienen algun valor en la columna [c1].


AMB


"Alejandro Mesa" wrote:

Menos complicado.

DECLARE @t TABLE (
c1 INT,
c2 INT,
c3 INT,
c4 INT
);

INSERT INTO @t VALUES ( NULL, 12, 13, 11 );
INSERT INTO @t VALUES ( 11, 7, 22, 34 );
INSERT INTO @t VALUES ( 14, 14, 3, 4 );

WITH r_set
AS
(
SELECT
COUNT(c1) AS cnt_c1,
COUNT(c2) AS cnt_c2,
COUNT(c3) AS cnt_c3,
COUNT(c4) AS cnt_c4,
COUNT(*) AS cnt
FROM
(SELECT 1 AS c0, c1, c2, c3, c4 FROM @t) AS t
GROUP BY
c0
)
SELECT
STUFF(
CASE WHEN cnt_c1 = cnt THEN ',c1' ELSE '' END +
CASE WHEN cnt_c2 = cnt THEN ',c2' ELSE '' END +
CASE WHEN cnt_c3 = cnt THEN ',c3' ELSE '' END +
CASE WHEN cnt_c4 = cnt THEN ',c4' ELSE '' END , 1, 1, '') AS c0
FROM
r_set;
GO


AMB



"Alejandro Mesa" wrote:

> David,
>
> Trata:
>
> DECLARE @t TABLE (
> c1 INT,
> c2 INT,
> c3 INT,
> c4 INT
> );
>
> INSERT INTO @t VALUES ( NULL, 12, 13, 11 );
> INSERT INTO @t VALUES ( 11, 7, 22, 34 );
> INSERT INTO @t VALUES ( 14, 14, 3, 4 );
>
> WITH r_set
> AS
> (
> SELECT
> COUNT(c1) AS cnt_c1,
> COUNT(c2) AS cnt_c2,
> COUNT(c3) AS cnt_c3,
> COUNT(c4) AS cnt_c4,
> COUNT(*) AS cnt
> FROM
> (SELECT 1 AS c0, c1, c2, c3, c4 FROM @t) AS t
> GROUP BY
> c0
> )
> SELECT
> REVERSE(
> STUFF(
> REVERSE(
> CASE WHEN cnt_c1 = cnt THEN 'c1,' ELSE '' END +
> CASE WHEN cnt_c2 = cnt THEN 'c2,' ELSE '' END +
> CASE WHEN cnt_c3 = cnt THEN 'c3,' ELSE '' END +
> CASE WHEN cnt_c4 = cnt THEN 'c4,' ELSE '' END
> ), 1, 1, '')
> ) AS c0
> FROM
> r_set;
> GO
>
>
> AMB
>
>
> "David" wrote:
>
> > Microsoft SQL Server 2000, con todos los Services Pack
> >
> > Muy buenas, como era de esperar no se ni por donde cogerlo, este es el
> > escenario
> >
> > TablaDatos
> >
> > [id]: clave principal
> > [c1]: decimal permite NULL
> > [c2]: decimal permite NULL
> > [c3]: decimal permite NULL
> > [c4]: decimal permite NULL
> >
> > .
> > más campos (no interesan para "el problema", filtraré por ellos)
> >
> > ¿Cómo implementar la siguiente consulta?
> >
> > Devuelve los nombres de los campos c1, c2, c3, c4 siempre y cuando en el
> > conjunto de los valores devueltos por la consulta una columna no tenga
> > ningún valor NULL.
> >
> > ¿qué dice, que pregunta?
> >
> > Veamoslo con ejemplos
> >
> > c1 c2 c3 c4
> > null 12 13 11
> > 11 7 22 34
> > 14 14 3 4
> >
> > La consulta para este conjunto de valores FILTARDOS deberái devolver:
> > LA RESPUESTA ES: c2,c3,c4
> >
> > c1 c2 c3 c4
> > null 12 13 11
> > 11 null 22 34
> > 14 null 3 4
> >
> > La consulta para este conjunto de valores FILTARDOS deberái devolver:
> > LA RESPUESTA ES:c3,c4
> >
> >
> > c1 c2 c3 c4
> > null 12 13 11
> > 11 7 22 34
> > 14 14 3 null
> >
> > La consulta para este conjunto de valores devueltos FILTARDOS deberái
> > devolver:
> > LA RESPUESTA ES: c2,c3
> >
> >
> >
> > De antemano muchas gracias
> >
> >
> >
> >
Respuesta Responder a este mensaje
#4 David
27/05/2009 - 10:20 | Informe spam
Gracias Alejandro Mesa, realmente JAMÁS hubiera dado con la solución, no sé
que decir, tan sólo que muchísimas gracias, a parte del "pescado" que me has
ofredido, intentaré ir más allá y llegar a comprender el transforndo de SQL,
pero bueno esto llevará TIEMPO.

Reitero mi agradecimiento.
Respuesta Responder a este mensaje
#5 Alejandro Mesa
27/05/2009 - 14:41 | Informe spam
David,

Tiempo, preciado tesoro.

Si quieres familiarizarte con los fundamentos de T-SQL, te recomiendo el
sgte libro:

Microsoft® SQL Server® 2008 T-SQL Fundamentals
http://www.amazon.com/Microsoft%C2%...0735626014

Si luegos quieres profundizar, entonces sigue con los sgte libro.

Inside Microsoft® SQL Server® 2008: T-SQL Querying
http://www.amazon.com/Inside-Micros...pd_sim_b_2

Si tienes alguna duda, no dudes en postearla aqui en el grupo. Hay muchos
miembros de este grupo que pueden ayudarte.

AMB


"David" wrote:

Gracias Alejandro Mesa, realmente JAMÁS hubiera dado con la solución, no sé
que decir, tan sólo que muchísimas gracias, a parte del "pescado" que me has
ofredido, intentaré ir más allá y llegar a comprender el transforndo de SQL,
pero bueno esto llevará TIEMPO.

Reitero mi agradecimiento.




Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida