SQL - consulta sumar articulos

   
Vista:

consulta sumar articulos

Publicado por asdfg (21 intervenciones) el 21/09/2011 20:22:27
Tengo una consulta (matriz articulos solicitados por mes) en la cual estoy contando los articulos vendidos por mes pero necesito sumar dichos articulos al contarlos me entrega los valores pero no puedo sumar las cantidades solicitadas (me arroja error) como puedo modificar la consulta.

tengo estos datos
cod_articulos nom_articulo mes cantidad
123 xxxxx enero 10
123 xxxxx enero 5
012 xxxx enero 23
123 xxxxx marzo 10
012 xxxx enero 5

necesito el resultado asi


cod_articulos nom_articulo enero febrero marzo .... total
123 xxxxx 15 0 10
012 xxxx 28 0 0
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

consulta sumar articulos

Publicado por leonardo_josue (877 intervenciones) el 21/09/2011 22:07:00
Hola asdfg (tu apellido será qwerty??? perdón, una pequeña broma)

No nos dices qué DBMS estás utilizando, hay varias formas para poder hacer esto, una sería utilizando case-when o if's, uno por cada mes, algo como esto:

1
2
3
4
5
6
7
8
9
10
11
select
cod_articulos,nom_articulo,
case when mes = 'enero' then sum(cantidad) else 0 end total_enero,
case when mes = 'febrero' then sum(cantidad) else 0 end total_febrero,
...
case when mes = 'diciembre' then sum(cantidad) else 0 end total_diciembre,
sum(cantidad) total
from
TuTabla
group by
cod_articulos,nom_articulo


Dependiendo del número de registros en tu tabla esta consulta podría resultar muy pesada y afectar el rendimiento de tu servidor. Otra opción sería utilizar tablas PIVOT aunque no todos los DBMS las manejan. Preguntale a San Google si tu DBMS implementa estas tablas para que te dé algunos ejemplos.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

consulta sumar articulos

Publicado por asdfg (21 intervenciones) el 22/09/2011 15:20:38
Leo: Me resulto gracias, tengo solo un inconveniente me suma los articulos en los meses que corresponden pero en diferentes filas yo necesito que salga solo en una.
Te envio la consulta por si me puedes ayudar, utilizo oracle 10g

SELECT
T.COD_SERDEP,
S.NOM_SERVIC,
V.COD_ARTICU,
R.COD_UNIDES,
V.NOM_ARTICU,
CASE WHEN T.Cod_Mesano = 0111 THEN sum(v.can_solici) ELSE 0 END AS ENERO,
CASE WHEN T.Cod_Mesano = 0211 THEN sum(v.can_solici) ELSE 0 END AS FEBRERO,
CASE WHEN T.Cod_Mesano = 0311 THEN sum(v.can_solici) ELSE 0 END AS MARZO,
CASE WHEN T.Cod_Mesano = 0411 THEN sum(v.can_solici) ELSE 0 END AS ABRIL,
CASE WHEN T.Cod_Mesano = 0511 THEN sum(v.can_solici) ELSE 0 END AS MAYO,
CASE WHEN T.Cod_Mesano = 0611 THEN sum(v.can_solici) ELSE 0 END AS JUNIO,
CASE WHEN T.Cod_Mesano = 0711 THEN sum(v.can_solici) ELSE 0 END AS JULIO,
CASE WHEN T.Cod_Mesano = 0811 THEN sum(v.can_solici) ELSE 0 END AS AGOSTO,
CASE WHEN T.Cod_Mesano = 0911 THEN sum(v.can_solici) ELSE 0 END AS SEPTIEMBRE,
CASE WHEN T.Cod_Mesano = 1011 THEN sum(v.can_solici) ELSE 0 END AS OCTUBRE,
CASE WHEN T.Cod_Mesano = 1111 THEN sum(v.can_solici) ELSE 0 END AS NOVIEMBRE,
CASE WHEN T.Cod_Mesano = 1211 THEN sum(v.can_solici) ELSE 0 END AS DICIEMBRE
FROM
AB_TESOLCOM T,
AM_TSERVI S,
AB_TDSOLCOM V,
AB_TARTICULOS R
WHERE
to_char(T.FEC_SOLCOM, 'MM') <= to_char(sysdate, 'mm') AND
to_char(T.FEC_SOLCOM, 'YYYY') = to_char(sysdate, 'yyyy') AND
V.NUM_SOLCOM = T.NUM_SOLCOM AND
T.COD_SERDEP = S.COD_SERVIC AND
V.COD_ARTICU = R.COD_ARTICU
GROUP BY
t.cod_mesano,
T.COD_SERDEP,
S.NOM_SERVIC,
V.COD_ARTICU,
R.COD_UNIDES,
V.NOM_ARTICU


ORDER BY
S.NOM_SERVIC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

consulta sumar articulos

Publicado por leonardo_josue (877 intervenciones) el 22/09/2011 17:24:07
Hola de nuevo asdfg:

Ayer tuve un error en la sintaxis de la consulta, los CASE-WHEN deben quedar así:

1
SUM(CASE WHEN mes = 1 THEN cantidad ELSE 0 END) Total_Enero


Es decir la sumatoria DEBE ESTAR FUERA DEL CASE. Además, es importante que revises tus campos de agrupación, te recuerdo si uno solo de ellos es distinto entonces no te agrupa. En estos momentos no puedo probar con ORACLE, pero te dejo un script en MySQL, la sintaxis debería funcionar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
mysql> CREATE TABLE TuTabla (id int, descripcion varchar(10), mes int,
    -> cantidad int);
Query OK, 0 rows affected (0.11 sec)
 
mysql> INSERT INTO TuTabla VALUES (1, 'uno', 1, 10), (1, 'uno', 2, 12),
    -> (1, 'uno', 1, 23), (1, 'uno', 2, 31), (2, 'dos', 1, 20),
    -> (2, 'dos', 2, 10), (2, 'dos', 2, 23);
Query OK, 7 rows affected (0.04 sec)
Records: 7  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM TuTabla;
+------+-------------+------+----------+
| id   | descripcion | mes  | cantidad |
+------+-------------+------+----------+
|    1 | uno         |    1 |       10 |
|    1 | uno         |    2 |       12 |
|    1 | uno         |    1 |       23 |
|    1 | uno         |    2 |       31 |
|    2 | dos         |    1 |       20 |
|    2 | dos         |    2 |       10 |
|    2 | dos         |    2 |       23 |
+------+-------------+------+----------+
7 rows in set (0.00 sec)
 
mysql> SELECT id, descripcion,
    -> SUM(CASE WHEN mes = 1 THEN cantidad ELSE 0 END) ENERO,
    -> SUM(CASE WHEN mes = 2 THEN cantidad ELSE 0 END) FEBRERO
    -> FROM TuTabla
    -> GROUP BY id, descripcion;
+------+-------------+-------+---------+
| id   | descripcion | ENERO | FEBRERO |
+------+-------------+-------+---------+
|    1 | uno         |    33 |      43 |
|    2 | dos         |    20 |      33 |
+------+-------------+-------+---------+
2 rows in set (0.00 sec)
 
mysql> INSERT INTO TuTabla values (1, 'unos', 1, 20);
Query OK, 1 row affected (0.11 sec)
 
mysql> SELECT id, descripcion,
    -> SUM(CASE WHEN mes = 1 THEN cantidad ELSE 0 END) ENERO,
    -> SUM(CASE WHEN mes = 2 THEN cantidad ELSE 0 END) FEBRERO
    -> FROM TuTabla
    -> GROUP BY id, descripcion;
+------+-------------+-------+---------+
| id   | descripcion | ENERO | FEBRERO |
+------+-------------+-------+---------+
|    1 | uno         |    33 |      43 |
|    1 | unos        |    20 |       0 |
|    2 | dos         |    20 |      33 |
+------+-------------+-------+---------+
3 rows in set (0.01 sec)


Observa que en la última consulta se está repitiendo un producto 1, esto es debido a que inserté un nuevo elemento con el id 1, pero con una descripción distinta (uno y unos), por lo tanto no es posible agruparlos.

Y finalmente una recomendación final. cuando utilices más de una tabla en una consulta UTILIZA SIEMPRE JOIN'S (INNER, LEFT O RIGTH) en lugar de listar las tablas en el FROM y hacer las uniones en el WHERE:

1
2
3
FROM tabla1, tabla2 WHERE tabla1.campo = tabla2.campo (No hacer esto)
 
FROM tabla1 INNER JOIN tabla2 ON tabla1.campo = tabla2.campo (usar siempre JOIN'S)


aunque el resultado es el mismo, la velocidad con que resuelve las consultas puede resultar importante, siendo la opción con JOIN's la óptima.

Dale un vistazo al código, cambia tus joins y nos comentas los resultados.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

consulta sumar articulos

Publicado por asdfg (21 intervenciones) el 22/09/2011 18:01:15
Leo: Si hice la modificacion en la consulta, es la misma sintaxis de count que yo tenia en una consulta anterior pero me faltaba un campo. Realice una modificacion al group by y todo bien, muchas gracias nuevamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

consulta sumar articulos

Publicado por asdfg (21 intervenciones) el 22/09/2011 20:31:37
A se me olvidaba tb agregue inner join, habia trabajado con un generador de consultas y me hizo las relaciones en el where, pero hay que usar la cabecita mejor, lo hice manual y me resulto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar