このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/902
#  DBMS:SQLite3.7.12.1(System.Data.SQLite1.0.81.0) 
#   
#  [テーブルデータ] 
#   
#  CREATE TABLE tblA( 
#      id            INTEGER, 
#      status001  INTEGER, 
#      status002  INTEGER, 
#      status003  INTEGER, 
#      status004  INTEGER, 
#              . 
#              . 
#              . 
#      status300  INTEGER 
#  ); 
#   
#  id    |status001|status002|.... .  |status300| 
#  ----+--------+--------+    +--------| 
#       1|     0     |     0      |     |     0      | 
#       2|      1     |     0      |     |     0      | 
#       3|      0     |     0      |     |     1      | 
#       4|      0     |     1      |     |     1      | 
#       5|      0     |     0      |     |     0      | 
#       6|      1     |     1      |     |     0      | 
#       7|      0     |     1      |     |     0      | 
#       8|      1     |     1      |     |     1      | 
#       9|      1     |     1      |     |     0      | 
#   
#  想定レコード数 50,000〜2000,000 
#   
#  [欲しい結果] 
#  ------------------------------------------- 
#  status001 | 4      //status001=1であるレコード数 
#  status002 | 5      //status002=1であるレコード数 
#  . 
#  . 
#  . 
#  status300 | 3      //status300=1であるレコード数 
#   
#  正規化に問題があるように思えますが 
#  これらを一度のSQLで取得出来ないでしょうか。 
#  この結果を最も速く取得する方法を模索しています(__) 
#   
# 

各フィールドの値が1である組数(_フィールド名,_組数) :-
between(1,300,N),
引数ならびを生成し指定フィールドを1とする(L1),
member([_フィールド名,L],L1),
指定フィールドが1の組数(L,_組数).


引数ならびを生成し指定フィールドを1とする(N,_フィールド名,L) :-
フィールド名の復元(N,_フィールド名),
length(L,300),
nth1(N,L,1).


指定フィールドが1の組数(L,_組数) :-
P =.. [tblA,_id|L],
count(P,_組数),
_組数 > 0.


フィールド名の復元(_フィールド名_0,N,_フィールド名) :-
'3要素のフィールド名識別名をならびで確保'(L),
number_chars(N,Chars),
append(L1,Chars,L),
変数として残った要素は0に単一化(L1),
ならび要素を結合したものがフィールド名([_フィールド名_0|L],_フィールド名).


'3要素のフィールド名識別名をならびで確保'(L) :-
length(L,3).


append([],L1,L2,L) :-
append(L1,L2,L).
append([A|R1],L1,L2,[A|R]) :-
append(R1,L1,L2,R).


変数として残った要素は0に単一化([]).
変数として残った要素は0に単一化(['0'|R]) :-
変数として残った要素は0に単一化(R).


ならび要素を結合したものがフィールド名(L,_フィールド名) :-
atomic_list_concat(L,_フィールド名).