2009-05-06 3 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/IIFSとビット扱いにくくなっていると手動の介入なしに属性の数の変更を処理しません。

アトリビュートカラムの最初の6文字は同じ(attrib)で表内でユニークです。カラム名にワイルドカードを使用して、適用可能なカラムをすべて拾うことはできますか?

また、ソートされた2列のレコードセットを得るために結果をピボットできますか?

私はAccess 2003を使用しています。クエリは最終的にExcelのADODBを経由します。

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

答えて

1

これは、あなたがどこかの属性名を持っているかどうかによって異なります。

+0

ありがとう、私はこのようにそれをやるだろうと思う。 .fields(x).nameを使用して列名を取得し、ループスルーしてテーブルを構築することができます。 – Lunatik

1

ジャストによって、単純な数とグループは、それが

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

そのため、コメントの使用分析関数に答えるために行う必要がありますデータ内の。そうすれば、鳥の答えがそのトリックをするでしょう。ただし、名前が列名のみの場合は、もう少し作業が必要です。単純なSQLではできないことは残念です。

いいえ、SQLでは列名にワイルドカードを使用できません。これを行うための手続き型コード(AccessのVB Module - SQL Serverの場合は、ストアドプロシージャ内で実行できます)が必要です。このコードを使用してSQLコードを作成します。

これはきれいではありません。私はだと思います。あなたは一度に1つの属性を実行する必要があります:値がその属性名で、count-where-Trueの文字列を選択し、Aを実行して結果を新しいスクラッチテーブル、またはB)バッチを実行する前に、それらの間のすべての選択をそれらの間の "連合"と一緒に追加します。

マイアクセスVBがさびビット以上のものですので、私はあなたに実行可能コードのようなものを与えるために自分自身を信頼していない.... Accessで

+0

この表にはこれらの属性以上のものがあります。私がデータベースを再配置できたら、私はこのスキーマに悩まされています。 また、1つではなく、すべての属性をリストしたいと思います。あなたはそれをどのように扱いますか? – Lunatik

+0

あなたは、そのために分析関数を使うことができます: select attribute_table。* 、count(*)以上(パーティションby attribute_name)cnt from attribute_table これにより、attribute_nameの合計が得られ、すべての属性とすべての行が返されます(もちろん、合計で) – northpole

+0

これらをテストしましたかAccessの機能ですか?私の知る限り、Jet SQLではサポートされていません。 –

0

、クロスタブクエリ(データセットを転置のための伝統的なツール)少なくとも3つの数値/日付フィールドが必要です。しかし、Excelに出力するので、ピボットテーブルを使用して非表示のシートにデータを出力するだけでよいのですか?

+0

はい、これは私のバックアップ計画でした。 – Lunatik

関連する問題