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