我正在尝试使用SQL查找表中特定值的总和。样本表是:
+-------+-------+-------+-------+-------+-------+-------+
| 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 |
+-------+-------+-------+-------+-------+-------+-------+
我有35个这样的'代码'列和值。
我需要的是选择只有一个代码的表。假设我需要代码AA3,这将是(此处不需要代码列,但仅显示我获取值的位置):
+-------+-------+--------+
| ID | Code | Value |
+-------+-------+--------+
| 01 | AA3 | 328.34|
| 02 | AA3 | 234.56|
| 03 | AA3 | 0|
+-------+-------+--------+
我稍后需要另一个(单独的)查询,其中包含多个代码的总和,例如代码AA1和AA2的总和。
+-------+---------+
| ID | Value |
+-------+---------+
| 01 | 34.2|
| 02 | 27.0|
| 03 | 409.01|
+-------+---------+
我正在考虑拥有一个'WHERE'并在每35列上运行,但这真的很乏味,而且这看起来效率不高。我想知道是否有办法通过SQL做到这一点(我可以使用带有if语句的Excel来完成它并且它可以创造奇迹)。
也许如果有办法'搜索'一行,返回列名,然后使用该列名来检索数字?
如果您需要更多信息请告诉我们=)
答案 0 :(得分:2)
您应该做的是以规范化形式存储数据。
...然而
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
将返回您寻找的结果
答案 1 :(得分:0)
您的桌面结构不太理想。我将向您展示一个类似于基于Excel的IF
方法的直接示例,然后使用规范化的数据结构进行更简单的查询。
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
每个id
有30个代码,您需要30个CASE
语句。
另一种方法是每id
个数据行,而不是每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|
+-------+-------+-------+-------+
查询很简单,您可以根据需要添加任意数量的观察结果,而无需更改表格结构,以及其他一系列优势......
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