【问题标题】:How best to sum multiple boolean values via SQL?如何最好地通过 SQL 对多个布尔值求和?
【发布时间】:2009-05-06 14:19:13
【问题描述】:

我有一个表,其中包含大约 30 列布尔标志,这些标志表示特定属性。我想将它们按频率排序作为记录集连同它们的列名一起返回,如下所示:

Attribute    Count
attrib9      43
attrib13     27 
attrib19     21
etc.

到目前为止,我的努力可以达到类似的效果,但我只能使用条件 SUM 获取列中的属性,如下所示:

SELECT SUM(IIF(a.attribIndex=-1,1,0)), SUM(IIF(a.attribWorkflow =-1,1,0))...

此外,对于所有 30 个 SUM/IIF,查询已经变得有点笨拙,并且在没有人工干预的情况下不会处理属性数量的任何变化。

属性列的前六个字符在表中相同(attrib)且唯一,是否可以在列名中使用通配符来选取所有适用的列?

另外,我可以对结果进行转置以给我一个排序的两列记录集吗?

我使用的是 Access 2003,查询最终将通过 Excel 中的 ADODB。

【问题讨论】:

    标签: sql ms-access jet


    【解决方案1】:

    这取决于您是否在数据中的任何地方都有属性名称。如果你这样做了,那么birdlips 的回答就可以解决问题。但是,如果名称只是列名,那么您还有更多工作要做——而且我担心您无法使用简单的 SQL 来完成。

    不,您不能在 SQL 中对列名使用通配符。您需要过程代码来执行此操作(即,Access 中的 VB 模块——如果您在 SQL Server 上,您可以在存储过程中执行此操作)。使用此代码构建 SQL 代码。

    不会很漂亮。我认为您需要一次执行一个属性:选择一个字符串,其值为该属性名称和 count-where-True,然后 A)运行该字符串并将结果存储在临时表中的新行,或 B) 在运行批处理之前将所有这些选择与它们之间的“联合”附加在一起。

    我的 Access VB 有点生疏了,所以我不相信自己会给你任何可执行代码之类的东西......

    【讨论】:

    • 谢谢,我想我最终会这样做。我可以使用 .fields(x).name 获取列名,然后循环并构建我的表。
    【解决方案2】:

    只需简单的计数和分组就可以了

      Select attribute_name
             , count(*)
          from attribute_table
        group by attribute_name
    

    要回答您的评论,请使用分析函数:

     Select attribute_table.*
            , count(*) over(partition by attribute_name) cnt
       from attribute_table
    

    【讨论】:

    • 在这个表中不仅有这些属性。如果我能够重新排列数据库,那么我会的,但我被这个模式困住了。我还想列出所有属性,而不仅仅是一个。你会怎么处理呢?
    • 您可以为此使用分析函数: Select attribute_table.* , count(*) over(partition by attribute_name) cnt from attribute_table 这将为您提供attribute_name 的总和并将所有属性返回为以及每一行(当然是总数)
    • 你在Access中测试过这些功能吗?据我所知,Jet SQL 不支持它们。
    • 您说得对,它们不受支持。当我第一次发布这个时,我相信唯一的标签是'sql'。很抱歉造成混乱。
    【解决方案3】:

    在 Access 中,交叉表查询(用于转置数据集的传统工具)至少需要 3 个数字/日期字段才能工作。但是由于输出到 Excel,您是否考虑过将数据输出到隐藏工作表然后使用数据透视表?

    【讨论】:

    • 是的,这是我的备用计划。
    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2015-08-03
    • 2017-05-08
    • 2016-11-19
    • 2011-12-01
    相关资源
    最近更新 更多