varios una sumar suma resultados promedio nativas funciones funcion ejemplo consulta condicion con columnas campos avg agregado sql sql-server-2008-r2 sum rows multiple-columns

una - sumar columnas en sql server



Suma de valores específicos en SQL (2)

Estoy tratando de encontrar la suma de valores específicos dentro de una tabla, usando SQL. Una tabla de muestra es:

+-------+-------+-------+-------+-------+-------+-------+ | ID | Co1 | Va1 | Co2 | Va2 | Co3 | Va3 | +-------+-------+-------+-------+-------+-------+-------+ | 01 | AA1 | 23.0| AA2 | 11.2| AA3 | 328.34| | 02 | AA2 | 27.0| AA3 | 234.56| AA4 | 23.8| | 03 | AA1 | 409.01| AA4 | 234.98| NULL | NULL | +-------+-------+-------+-------+-------+-------+-------+

Tengo 35 columnas y valores de ''Código''.

Lo que necesito es seleccionar una tabla que tenga solo un código. Digamos que necesito el Código AA3, esto sería (la columna Código no es obligatoria aquí, pero solo para mostrar dónde obtuve los valores):

+-------+-------+--------+ | ID | Code | Value | +-------+-------+--------+ | 01 | AA3 | 328.34| | 02 | AA3 | 234.56| | 03 | AA3 | 0| +-------+-------+--------+

Y luego necesitaré otra consulta (separada) que contiene la suma de varios códigos, por ejemplo, la suma de los códigos AA1 y AA2 juntos.

+-------+---------+ | ID | Value | +-------+---------+ | 01 | 34.2| | 02 | 27.0| | 03 | 409.01| +-------+---------+

Estaba pensando en tener un ''DONDE'' y ejecutar en cada 35 columnas, pero eso sería realmente tedioso y esto no parece demasiado eficiente. Me preguntaba si había una forma de hacerlo a través de SQL (puedo hacerlo con Excel con una instrucción if y funciona de maravilla).

¿Tal vez si hubiera una forma de ''buscar'' a través de una fila, devuelva el nombre de la columna y luego use ese nombre de columna para recuperar el número?

Avíseme si necesita más información =)


La estructura de su mesa es menos que ideal. Le mostraré un ejemplo directo similar a su método IF basado en Excel, y luego una consulta mucho más simple con una estructura de datos normalizada.

SELECT id, CASE WHEN co1 = ''AA1'' THEN co1 ELSE 0 END + CASE WHEN co2 = ''AA1'' THEN co2 ELSE 0 END + CASE WHEN co3 = ''AA1'' THEN co3 ELSE 0 END + CASE WHEN co4 = ''AA1'' THEN co4 ELSE 0 END + etc, etc FROM yourTable

Con 30 códigos por id , necesita 30 declaraciones CASE .

La alternativa es tener varias filas de datos por id , en lugar de varias columnas por id .

+-------+-------+-------+-------+ | ID | Obs | Cod | Val | +-------+-------+-------+-------+ | 01 | 1 | AA1 | 23.0 | | 01 | 2 | AA2 | 11.2 | | 01 | 3 | AA3 | 328.34| | 02 | 1 | AA2 | 27.0| | 02 | 2 | AA3 | 234.56| | 02 | 3 | AA4 | 23.8| | 03 | 1 | AA1 | 409.01| | 03 | 2 | AA4 | 234.98| +-------+-------+-------+-------+

La consulta es simple, puede agregar tantas observaciones como desee sin cambiar la estructura de la tabla, y una gran cantidad de otras ventajas ...

Query if one id can have several Query if one id can only have one observations for the same code: observation for any one code: ---------------------------------- ----------------------------------- SELECT SELECT id, * cod, FROM SUM(val) AS val yourTable FROM WHERE yourTable cod = ''AA1'' WHERE cod = ''AA1'' GROUP BY id, cod


Lo que debes hacer es almacenar tus datos en una forma normalizada .

Sin embargo...

select SUM(v) from ( select * -- ID, r, v from (select * from yourtable) u unpivot ( r for co in (co1, co2, co3)) as u1 unpivot ( v for va in (va1, va2, va3)) as u2 where RIGHT(co,1) = RIGHT(va,1) ) v WHERE R = ''AA1'' -- etc

devolverá los resultados que busca