gpt4 book ai didi

mysql - 如何计算数据库中的水平值?

转载 作者:可可西里 更新时间:2023-11-01 07:02:46 25 4
gpt4 key购买 nike

假设我有一个具有如下水平结构的数据库:

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

信息是数据字段,我想计算某个判别式的所有次数,例如“大于 0”

我认为它是循环遍历所有字段,然后计数,或者 COUNT() 每个 DATA 字段,所以 SUM() 那些 7 查询...有人有其他想法吗?

在这种情况下的结果,所以 “计算每个值超过 0 的 DATA 字段” 将 = 7

最佳答案

没有内置语法允许您动态引用一组列,即无需显式命名它们。如果您想要动态性,则需要查询元数据以获取所需的列名称,然后动态构建最终查询。

但在此之前,您仍然需要了解动态查询应该如何执行作业本身。因此,您首先需要解决有限列集上的问题。

解决这个问题的方法不止一种。 method suggested by @bluefeet可能是更清晰但效率较低的方法之一。您至少可以尝试两种选择:

  1. 使用条件聚合分别计算每一列并将所有结果加到一个表达式中:

    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
    ;

    (解释了 OR NULL 技巧 here。)

  2. 使用交叉连接将 DATA 列反透视到虚拟表,然后将条件应用于反透视列:

    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
    ;

    (在某种程度上,这类似于@bluefeet 的建议,只是不使用任何 UNION。)

关于mysql - 如何计算数据库中的水平值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15085825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com