3

私のクエリは次のようになります。

SELECT mthreport.*
FROM crosstab
('SELECT 
to_char(ipstimestamp, ''mon DD HH24h'') As row_name, 
varid::text || log.varid || ''_'' || ips.objectname::text As bucket, 
COUNT(*)::integer As bucketvalue
FROM loggingdb_ips_boolean As log 
INNER JOIN IpsObjects As ips 
ON log.Varid=ips.ObjectId
WHERE ((log.varid = 37551) 
OR (log.varid = 27087) 
OR (log.varid = 50876)
OR (log.varid = 45096)
OR (log.varid = 54708)
OR (log.varid = 47475)
OR (log.varid = 54606)
OR (log.varid = 25528)
OR (log.varid = 54729))
GROUP BY to_char(ipstimestamp, ''yyyy MM DD HH24h''), row_name, objectid, bucket        
ORDER BY to_char(ipstimestamp, ''yyyy MM DD HH24h''), row_name, objectid, bucket' )

As mthreport(item_name text,  varid_37551 integer, 
            varid_27087  integer , 
            varid_50876  integer , 
            varid_45096  integer , 
            varid_54708  integer , 
            varid_47475  integer , 
            varid_54606  integer , 
            varid_25528  integer , 
            varid_54729  integer , 
            varid_29469 integer)

クエリは、次の接続文字列を使用してテスト テーブルに対してテストできます: "host=bellariastrasse.com port=5432 dbname=IpsLogging user=guest password=guest"

クエリは構文的に正しく、正常に実行されます。私の問題は、COUNT(*) 値が常に左端の列を埋めていることです。ただし、多くの場合、左側の列にはゼロまたは NULL を指定し、2 番目 (または n 番目) の列のみを入力する必要があります。私の脳はとろけていて、何が悪いのか理解できません!

4

1 に答える 1

2

問題の解決策は、2 つのパラメーターcrosstab()を持つバリアントを使用することです。

2 番目のパラメーター (別のクエリ文字列) は、データ クエリ (最初のパラメーター) の NULL 値が正しく割り当てられるように、出力列のリストを生成します。

tablefunc 拡張機能のマニュアルを確認してください。特にcrosstab(text, text):

クロス集計の単一パラメーター形式の主な制限は、グループ内のすべての値を同様に扱い、各値を最初に使用可能な列に挿入することです。値の列を特定のカテゴリのデータに対応させたい場合、一部のグループには一部のカテゴリのデータがない可能性があるため、うまく機能しません。crosstab の 2 パラメータ形式は、出力列に対応するカテゴリの明示的なリストを提供することで、このケースを処理します。

鉱山を強調します。最近、ここまたはここまたはここに関連する回答をいくつか投稿しました。

于 2012-06-17T23:55:45.600 に答える