監査テーブルfamily_auditおよびfamily_address_auditからレポートを生成する以下のSQLがあります。Postgres SQL:このSQLでGROUP BYを実行する方法
(SELECT fam.familyserialno, fam.familyname, addr.housenumber, addr.address1,
COALESCE(fam.operation, addr.operation) op,
COALESCE(fam.username, addr.username) usr,
COALESCE(fam.adddate, addr.adddate) add_date,
(SELECT r.userrolename
FROM userrole_master r, user_master u
WHERE u.loginid=COALESCE(fam.username, addr.username) AND r.userrole_id=u.userrole_id) rolename
FROM family_audit fam
INNER JOIN family_address_audit addr USING(txid, family_id)
WHERE (fam.node_id = 8) AND (fam.familyserialno >=1 and fam.familyserialno <=5)
)
UNION
(SELECT fam.familyserialno, fam.familyname,
addr.housenumber, addr.address1,
COALESCE(fam.operation, addr.operation) op,
COALESCE(fam.username, addr.username) usr,
COALESCE(fam.adddate, addr.adddate) add_date,
(SELECT r.userrolename
FROM userrole_master r, user_master u
WHERE u.loginid=COALESCE(fam.username, addr.username) AND r.userrole_id=u.userrole_id) rolename
FROM family_audit fam
FULL OUTER JOIN family_address_audit addr USING(txid, family_id)
WHERE ((fam.familyserialno IS NULL and addr.family_id in
(select family_id
from family
where familyserialno >=1 and familyserialno <=5 and node_id =8))
OR ((addr.family_id IS NULL) and ((fam.familyserialno >=1 and fam.familyserialno <=5) and fam.node_id=8)))
)
ORDER BY add_date DESC;
"上記" SQLからの典型的な出力は
familyserialno | familyname | housenumber | address1 | op | usr | add_date | rolename
----------------+------------+-------------+------------+----+-------+-------------------------+----------
3 | thirda | | | U | admin | 2010-11-24 15:29:34.312 | admin
| | 34324 | sdfdsfdsf | U | admin | 2010-11-24 15:28:42.314 | admin
3 | third | | | I | admin | 2010-11-24 15:28:34.576 | admin
| | 333 | sdfdsf | U | admin | 2010-11-24 15:18:57.129 | admin
2 | aSecond | | | I | admin | 2010-11-24 14:58:15.477 | admin
1 | anjanFirst | anjanFirst | anjanFirst | I | admin | 2010-11-24 14:12:35.477 | admin
======================
以下の通りでありますfam.familyserialnoで出力をグループ化したいとします。そこで、上記のSQLを以下のように変更しました。しかし、その(最後に)エラーになり
SELECT * from
((SELECT fam.familyserialno, fam.familyname, addr.housenumber, addr.address1,
COALESCE(fam.operation, addr.operation) op,
COALESCE(fam.username, addr.username) usr,
COALESCE(fam.adddate, addr.adddate) add_date,
(SELECT r.userrolename
FROM userrole_master r, user_master u
WHERE u.loginid=COALESCE(fam.username, addr.username) AND r.userrole_id=u.userrole_id) rolename
FROM family_audit fam
INNER JOIN family_address_audit addr USING(txid, family_id)
WHERE (fam.node_id = 8) AND (fam.familyserialno >=1 and fam.familyserialno <=5)
)
UNION
(SELECT fam.familyserialno, fam.familyname,
addr.housenumber, addr.address1,
COALESCE(fam.operation, addr.operation) op,
COALESCE(fam.username, addr.username) usr,
COALESCE(fam.adddate, addr.adddate) add_date,
(SELECT r.userrolename
FROM userrole_master r, user_master u
WHERE u.loginid=COALESCE(fam.username, addr.username) AND r.userrole_id=u.userrole_id) rolename
FROM family_audit fam
FULL OUTER JOIN family_address_audit addr USING(txid, family_id)
WHERE ((fam.familyserialno IS NULL and addr.family_id in
(select family_id
from family
where familyserialno >=1 and familyserialno <=5 and node_id =8))
OR ((addr.family_id IS NULL) and ((fam.familyserialno >=1 and fam.familyserialno <=5) and fam.node_id=8)))
))
GROUP BY 1
ORDER BY 7 DESC;
ERROR:別名 LINE 2を持っている必要がありますから、副問合せ:((fam.familyserialno、fam.familyname、addr.housenumbeを選択... ^ ヒント:。?。例えば、(SELECT ...)[AS]のfoo FROM
私はこれをどのように修正すればよい私たちは本当にすべての行がfam.familyserialnoによってグループ化する必要が
感謝あなたは大いに、
P.S:私たちはPostgres 8.4.4を使用しています。