2009-05-06 108 views
0

我有一张表,其中包含大约30列表示特定属性的布尔标志。我想回报他们,通过频率排序,作为一个记录他们的列名一起,就像这样:如何最好的通过SQL求和多个布尔值?

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 /综合投资框架有点笨拙,无需人工干预将无法处理属性个数的任何改变。

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

此外,我可以透视结果给我一个排序的两列记录集?

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

回答

1

这取决于你是否拥有属性名的任何地方in data。如果你这样做,那么birdlips的答案就能解决问题。但是,如果名称只是列名,那么您还有更多工作要做 - 而且我无法用简单的SQL来完成。

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

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

我访问VB超过有点生疏,所以我不相信我自己给你喜欢的可执行代码什么....

1

只是一个简单的计数和group by应该这样做

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

为了回答您的评论使用解析函数为:

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

虽然这个表格中不止有这些属性。如果我能够重新排列数据库,那么我会,但我坚持这个模式。 此外我想列出所有属性,而不仅仅是一个。你将如何处理? – Lunatik 2009-05-06 15:21:20

+0

您可能可能使用以下分析函数: 选择attribute_table。* ,count(*)over(按属性名分区)cnt from attribute_table 这会给你一个属性名,并返回所有属性以及每一行(总数当然) – northpole 2009-05-06 16:02:28

+0

你测试过了吗?在Access中的功能?据我所知,它们不受Jet SQL支持。 – 2009-05-06 21:19:49

0

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