Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过SQL对多个布尔值求和?_Sql_Ms Access_Jet - Fatal编程技术网

如何通过SQL对多个布尔值求和?

如何通过SQL对多个布尔值求和?,sql,ms-access,jet,Sql,Ms Access,Jet,我有一个表,其中包含大约30列表示特定属性的布尔标志。我想返回它们,按频率排序,作为记录集及其列名,如下所示: Attribute Count attrib9 43 attrib13 27 attrib19 21 etc. 到目前为止,我的努力可以实现类似的效果,但我只能使用条件和获取列中的属性,如下所示: SELECT SUM(IIF(a.attribIndex=-1,1,0)), SUM(IIF(a.attribWorkflow =-1,1,0))...

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

Attribute    Count
attrib9      43
attrib13     27 
attrib19     21
etc.
到目前为止,我的努力可以实现类似的效果,但我只能使用条件和获取列中的属性,如下所示:

SELECT SUM(IIF(a.attribIndex=-1,1,0)), SUM(IIF(a.attribWorkflow =-1,1,0))...
此外,对于所有30个SUM/IIF,查询已经变得有点笨拙,如果没有手动干预,将无法处理属性数量的任何更改

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

另外,我可以旋转结果以获得一个排序的两列记录集吗


我正在使用Access 2003,最终将通过Excel中的ADODB进行查询。

只需简单的计数和分组即可

  Select attribute_name
         , count(*)
      from attribute_table
    group by attribute_name
要回答您的评论,请使用分析函数:

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

这取决于数据中是否有属性名称。如果你这样做了,那么小鸟们的回答就可以了。但是,如果名称只是列名,那么您还有更多的工作要做——我恐怕您不能用简单的SQL来完成

不,不能在SQL中使用通配符来表示列名。要做到这一点,您需要过程代码(即Access中的VB模块——如果您在SQL Server上,您可以在存储过程中完成)。使用此代码生成SQL代码

不会很漂亮的。我认为您需要一次执行一个属性:选择一个字符串,其值为该属性名称,其中的计数为True,然后a)运行该字符串并将结果存储在暂存表的新行中,或者B)在运行批处理之前将所有这些选择与它们之间的“并集”一起追加


我的Access VB已经有点过时了,所以我不相信我自己会给你任何类似于可执行代码的东西……

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

但此表中的属性不止这些。如果我能够重新安排数据库,那么我会这样做,但我仍然坚持这个模式。我还想列出所有属性,而不仅仅是一个。如何处理?您可以使用分析函数:从属性表中选择属性表。*,count(*)over(按属性名称划分)cnt这将为您提供属性名称的总数,并返回所有属性以及每一行(当然是总数)您在Access中测试过这些功能吗?据我所知,JetSQL不支持它们。你是对的,它们不受支持。当我第一次发布这篇文章时,我相信唯一的标签是“sql”。抱歉搞混了。是的,这是我的备份计划。谢谢,我想我会这样做的。我可以使用.fields(x).name获取列名,然后循环并构建我的表。