0

我有一个表,其中包含大约 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。

4

3 回答 3

1

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

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

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

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

于 2009-05-06T15:23:51.393 回答
1

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

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

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

 Select attribute_table.*
        , count(*) over(partition by attribute_name) cnt
   from attribute_table
于 2009-05-06T14:24:44.890 回答
0

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

于 2009-05-06T17:00:32.503 回答