Mat*_*yr' 5 mysql field unpivot count
假设我有一个像这样的水平结构的数据库:
ID | NAME | DATA1 | DATA2 | DATA3 | DATA4 | DATA5 | DATA6 | DATA7
1 | mmm | 0 | 1 | 0 | 3 | 5 | 1 | 0
2 | bbb | 0 | 0 | 0 | 1 | 0 | 1 | 1
Run Code Online (Sandbox Code Playgroud)
信息是数据字段,我想计算某个判别式的所有时间,例如"大于0"
我认为它是循环所有领域,计数或COUNT()每个DATA领域的方式,所以SUM()那些7查询...任何人有另一个想法?
在这种情况下结果,所以"count every DATA field with a value over 0"将= 7
没有内置语法允许您动态引用一组列,即没有明确命名它们.如果需要动态性,则需要查询元数据以获取所需的列名,然后动态构建最终查询.
但在此之前,您仍然需要了解动态查询应该如何完成执行作业本身.因此,您首先需要在有限列集上解决问题.
解决这个问题的方法不止一种.@bluefeet建议的方法可能是更清晰,效率更低的方法之一.您可以尝试至少两种选择:
使用条件聚合分别计算每列,并将所有结果汇总到一个表达式中:
SELECT
COUNT(DATA1 > 0 OR NULL) +
COUNT(DATA2 > 0 OR NULL) +
COUNT(DATA3 > 0 OR NULL) +
COUNT(DATA4 > 0 OR NULL) +
COUNT(DATA5 > 0 OR NULL) +
COUNT(DATA6 > 0 OR NULL) +
COUNT(DATA7 > 0 OR NULL) AS TOTAL
FROM yourtable
;
Run Code Online (Sandbox Code Playgroud)
DATA使用交叉连接取消激活列到虚拟表,然后将条件应用于unpivoted列:
SELECT
COUNT(*) AS TOTAL
FROM (
SELECT
CASE s.col
WHEN 'DATA1' THEN DATA1
WHEN 'DATA2' THEN DATA2
WHEN 'DATA3' THEN DATA3
WHEN 'DATA4' THEN DATA4
WHEN 'DATA5' THEN DATA5
WHEN 'DATA6' THEN DATA6
WHEN 'DATA7' THEN DATA7
END AS DATA
FROM yourtable
CROSS JOIN (
SELECT 'DATA1' AS col
UNION ALL SELECT 'DATA2'
UNION ALL SELECT 'DATA3'
UNION ALL SELECT 'DATA4'
UNION ALL SELECT 'DATA5'
UNION ALL SELECT 'DATA6'
UNION ALL SELECT 'DATA7'
) s
) s
WHERE DATA > 0
;
Run Code Online (Sandbox Code Playgroud)
(在某种程度上,这类似于@ bluefeet的建议,它只是不使用任何UNION.)
| 归档时间: |
|
| 查看次数: |
1549 次 |
| 最近记录: |