このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1299305530/7
#  よくある質問2 
#   
#  (問) 
#  key   data 
#  ---------------- 
#  1     a 
#  1     a 
#  1     b 
#  1     b 
#  1     a 
#  2     b 
#  2     a 
#  2     a 
#   
#  というテーブルから 
#   
#  key   a   b 
#  -------------------- 
#  1    3   2 
#  2    2   1 
#   
#  というExcelのピボットの様なデータを取得したいのですが、どういうSQLになりますか? 
#  a,bというのは固定なので、仮にcというデータがあっても無視して構いません。 
#   
#  (答) 
#  SELECT key, 
#      SUM(CASE data WHEN 'a' THEN 1 END) AS a, 
#      SUM(CASE data WHEN 'b' THEN 1 END) AS b 
#  FROM table 
#  GROUP BY key 
#  ORDER BY key 
#  ; 
# 

'Excelのピボットの様なデータを取得したい' :-
'keyのならびを得る'(L1),
'keyごとにa,bの度数を求めて、一行で表示する'(L1).

'keyのならびを得る'(L1) :-
setof(_key,_data ^ table(_key,_data),L1).

'keyごとにa,bの度数を求めて、一行で表示する'(L1) :-
forall(
'keyごとにa,bの度数を求めて、'(L1,_key,L2),
'key,aの度数,bの度数を表示する'(_key,L2)).

'keyごとにa,bの度数を求めて、'(L1,_key,L2) :-
member(_key,L1),
findall(_度数,'a,bの度数'(_data,_度数),L2).

'a,bの度数'(_data,_度数),L2) :-
member(_data,[a,b]),
度数(table(_key,_data),_度数).

度数(_目標,_度数) :-
findall(1,_目標,L),
length(L,_度数).

'key,aの度数,bの度数を表示する'(_key,L2) :-
atomic_list_concat([_key|L2],',',_表示行文字列),
writef('%w\n',[_表示行文字列]).