2010-11-25 14 views
0

監査テーブル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を使用しています。

答えて

3

あなたはのように、サブクエリをエイリアスする必要があります。

SELECT * FROM ((SELECT ...) UNION (SELECT ...)) AS foo GROUP BY 1 ORDER BY 7 DESC; 

ここfooは、サブクエリの別名です。