Consulta a BBDD con campo calculado

Buenas,

me he currado una pedazo de consulta, y me he quedado a un paso del final.

Digamos que tengo una consulta A que me devuelve esto:

Nombre; Cantidad
Pepe; 100€
Juan; 150€

Quiero hacer una consulta para que me añada un campo adicional como suma de las dos cantidades, de manera que quede así:

Nombre; Cantidad; Suma
Pepe; 100€; 250€
Juan; 150€; 250€

He probado con

select SubQuery1.Nombre, SubQuery1.Cantidad, SUM(SubQuery1.Cantidad) as Suma FROM
(
...
)
SubQuery1


Pero no me las suma (ni me da error).

¿Alguna idea?

Gracias!
Quieres que ese dato te lo guarde en la BD o que solo lo muestre?
cafero escribió:Quieres que ese dato te lo guarde en la BD o que solo lo muestre?


Sólo necesito que lo muestre.

Gracias!
No te suma el total porque no está agrupado. Puedes meter una subquery para mostrar el total, algo así:

select SubQuery1.Nombre, SubQuery1.Cantidad, (select sum(SubQuery1.Cantidad) from SubQuery1) as Suma FROM
(
...
)
SubQuery1
fryk escribió:group by...


Reitero lo dicho, necesitas agrupar por algo, en este caso veo que sólo quieres sumar todas las cantidades sin agrupar por nada, para ello haz como te ha dicho el compañero Carlcox, en una subquery sumas todo y luego lo recuperas.
fryk escribió:
fryk escribió:group by...


Reitero lo dicho, necesitas agrupar por algo, en este caso veo que sólo quieres sumar todas las cantidades sin agrupar por nada, para ello haz como te ha dicho el compañero Carlcox, en una subquery sumas todo y luego lo recuperas.


Lo he intentado, pero no me sale. ¿por qué campo agrupo?

Gracias!
banderas20 escribió:
fryk escribió:
fryk escribió:group by...


Reitero lo dicho, necesitas agrupar por algo, en este caso veo que sólo quieres sumar todas las cantidades sin agrupar por nada, para ello haz como te ha dicho el compañero Carlcox, en una subquery sumas todo y luego lo recuperas.


Lo he intentado, pero no me sale. ¿por qué campo agrupo?

Gracias!



Pásame la query exacta y te la modifico
fryk escribió:Pásame la query exacta y te la modifico


Ostras, muchas gracias. Te la paso por privado!

Cuando entienda lo que pasaba, lo posteo por aquí para el resto [oki]
Si no te lo han solucionado avisa
cafero escribió:Si no te lo han solucionado avisa

Buenas. Un compañero me ha ofrecido una solución, pero es un código bastante largo que implica más subqueries. Yo lo he conseguido resolver con una tabla temporal, pero seguro que se puede hacer de una manera más elegante y sin tantas subqueries. Si se te ocurre algo, agradezco tu ayuda.

Gracias a todos!!!
Que BBDD es? Es Oracle por casualidad?
Txukie escribió:Que BBDD es? Es Oracle por casualidad?

SQLServer2008 ;)
Pásame la query, hay una solución bastante elegante usando funciones analiticas
Txukie escribió:Pásame la query, hay una solución bastante elegante usando funciones analiticas

Gracias, compi. Mañana te la paso!!

EDIT: El compañero Txukie se ha ganado una cerveza!!! Posteo la query original y su solución para el que quiera comparar.

Original:
SELECT DISTINCT SubQuery3.TIPO_INC, COUNT(SubQuery3.TIPO_INC) as Cuenta FROM
               (
               select AVISOS.NUMERO, AVISOS.DNI, AVISOS.DESCRIP, DATEADD (minute,MINUTOS,convert(datetime, FECHA, 120)) as T_AVISO, INTERV.TEXTO as TIPO_INC, FPRIOR.TEXTO as PRIORIDAD
               from AVISOS inner join INTERV
               on AVISOS.TIPOINTERV=INTERV.ID
               inner join FPRIOR
               on AVISOS.PRIORIDAD=FPRIOR.ID
               where AVISOS.CONTRATO=11
               and AVISOS.ESTADO02=0
               and AVISOS.PRIORIDAD IN (67108869,67108870,67108873)
               and DATEADD (minute,MINUTOS,convert(datetime, FECHA, 120)) between convert(datetime, '2014-09-01 00:00:00',120) and convert(datetime, '2014-09-30 23:59:00',120)
               )
               SubQuery3
            group by SubQuery3.TIPO_INC

Solución:
SELECT DISTINCT SubQuery3.TIPO_INC, COUNT(SubQuery3.TIPO_INC) as Cuenta,
SUM(COUNT(SubQuery3.TIPO_INC)) OVER () as Suma
FROM
(
select AVISOS.NUMERO, AVISOS.DNI, AVISOS.DESCRIP, DATEADD (minute,MINUTOS,convert(datetime, FECHA, 120)) as T_AVISO, INTERV.TEXTO as TIPO_INC, FPRIOR.TEXTO as PRIORIDAD
from AVISOS inner join INTERV
on AVISOS.TIPOINTERV=INTERV.ID
inner join FPRIOR
on AVISOS.PRIORIDAD=FPRIOR.ID
where AVISOS.CONTRATO=11
and AVISOS.ESTADO02=0
and AVISOS.PRIORIDAD IN (67108869,67108870,67108873)
and DATEADD (minute,MINUTOS,convert(datetime, FECHA, 120)) between convert(datetime, '2014-09-01 00:00:00',120) and convert(datetime, '2014-09-30 23:59:00',120)
)
SubQuery3
group by SubQuery3.TIPO_INC


Gracias a todos, y sobre todo a Txukie [oki]
Para el que quiera mas info :

http://msdn.microsoft.com/es-es/library ... (v=sql.105).aspx

Por cierto, usando eso te puedes quitar la subquery de en medio
Txukie escribió:Para el que quiera mas info :

http://msdn.microsoft.com/es-es/library ... (v=sql.105).aspx

Por cierto, usando eso te puedes quitar la subquery de en medio


Creo que el link correcto es éste:

http://msdn.microsoft.com/es-es/library ... l.105.aspx

Por cierto, de las que salen ahí las conocía todas salvo el OVER(). Ya es casualidad...

Gracias!
Ahora que está solucionado, solo añadir que dependiendo de la plataforma, el tipo de BBDD, cantidad de datos y demás a veces es preferible hacer la captura de forma más genérica en y procesarla en local a través de la app que la lleva (si es el caso, que no lo se).
exitfor escribió:Ahora que está solucionado, solo añadir que dependiendo de la plataforma, el tipo de BBDD, cantidad de datos y demás a veces es preferible hacer la captura de forma más genérica en y procesarla en local a través de la app que la lleva (si es el caso, que no lo se).


No te entiendo... :(
banderas20 escribió:
exitfor escribió:Ahora que está solucionado, solo añadir que dependiendo de la plataforma, el tipo de BBDD, cantidad de datos y demás a veces es preferible hacer la captura de forma más genérica en y procesarla en local a través de la app que la lleva (si es el caso, que no lo se).


No te entiendo... :(

Ejemplo rápido (que no el más adecuado).

Tú puedes conseguir eso como lo has hecho, a base de consultas que se van refinando, y con la consecuente demora/carga de servidor (no es el caso imagino), o puedes coger los resultados de una primera búsqueda, y que la aplicación local asociada (si es que existe) se encargue de sumar en este caso y mostrar el resultado por pantalla.

Nada, olvidalo. No es el mejor ejemplo.
Solo que hay casos en que es preferible no sobrecargar según que tipos de BBDD (no es lo mismo una sql que una no-sql, y depende como hayan montado el indexado ni te cuento...) si al final va a ir dirigido a una aplicación local que puede procesar todo el resto. Seguro que hay mejores expertos que yo por aquí en bases de datos que te sabrán explicar el tema con mucha más claridad si te interesa.
exitfor escribió:Tú puedes conseguir eso como lo has hecho, a base de consultas que se van refinando, y con la consecuente demora/carga de servidor (no es el caso imagino), o puedes coger los resultados de una primera búsqueda, y que la aplicación local asociada (si es que existe) se encargue de sumar en este caso y mostrar el resultado por pantalla.


Ya te entiendo. Pero no es el caso. En todo caso, lo tendré en cuenta para futuras aplicaciones.

Gracias por el apunte! [oki]
21 respuestas