2012-04-10 2 views
0

OK, ceci est une deuxième tentative pour résoudre mon problème, pour ceux qui vont lire ceci une seconde fois, j'espère que c'est assez clair pour comprendre un problème.Interroger et ajouter des lignes

Je développe une requête pour un rapport, le fait est que lors de la récupération des données de la base de données, ce rapport devrait remplir certaines lignes, qui n'existent pas. Pour illustrer l'exemple permet de dire que j'ai ces tables:

Table 1 - Companies 

Table 2 - Transactions. 

Table 3 - Transaction types. 

détail important que la plupart des entreprises ne disposent pas de transactions de tous les types de transactions. Bien que la logique du rapport nécessite de faire jouer une entreprise avec tous les «vrais» avec des valeurs en argent réel et d'autres, pas existé avec seulement 0 $. Le problème commence ici parce que les types de transaction sont combinés en groupes logiques, donc disons que si une entreprise n'a qu'une transaction réelle de type_1, le rapport devrait contenir des enregistrements "$ 0" d'autres types associés à type_1, comme type_2, type_3 et type_4. Si la société a des transactions de type_1 et type_2, le rapport doit être rempli avec d'autres types de tran de différents types de transactions, etc.

Le problème ici est que l'environnement dans lequel il doit être exécuté doit être un SQL pur (étant un Java). programmeur je comprends combien il est facile d'interroger la base de données, charger les données dans array [] [] et ajouter des types de transaction manquants) - mais la requête doit être exécutée sur UNIX dans le batch plsql.

Merci d'avance. Toute aide ou idée serait très appréciée!

Répondre

0

Vous pouvez utiliser deux sous-requêtes une pour trouver toutes les transactions par entreprise en fonction des types existants de l'entreprise, deuxièmement pour trouver les totaux.

SELECT companies.id, all_transactions.transaction, COALESCE(sums.total_amount, 0) 
FROM companies 
JOIN (SELECT ct.companyid, t.transaction 
    FROM transactions ct 
    JOIN transactions t ON t.transactiontype = ct.transactiontype 
    GROUP BY ct.companyid, t.transaction) all_transactions ON all_transactions.companyid = companies.companyid 
LEFT JOIN (SELECT ct.companyid, SUM(t.amount) as total_amount 
    FROM transactions ct 
    GROUP BY ct.companyid) sums ON sums.companyid = companies.companyid 
1

Il semble que vous ayez juste besoin d'une sorte de jointure externe. Je devine que la façon dont vos tableaux se rapportent les uns aux autres, mais il semble que vous voulez quelque chose comme

SELECT c_typ_cross_join.company_name, 
     c_typ_cross_join.transaction_type, 
     nvl(sum(t.transaction_amount), 0) total_amt 
    FROM (SELECT c.company_name, 
       typ.transaction_type 
      FROM companies c 
       FULL OUTER JOIN transaction_type typ) c_typ_cross_join 
     LEFT OUTER JOIN transactions t ON ( c_typ_cross_join.company_id  = t.company_id 
              AND c_typ_cross_join.transaction_type = t.transaction_typ) 
GROUP BY c_typ_cross_join.company_name, 
      c_typ_cross_join.transaction_type 

Cela devrait produire une ligne pour chaque entreprise pour chaque type de transaction et la somme des opérations connexes (ou 0 si il n'y a pas de transactions pour la combinaison de sociétés et de types de transactions).

+0

Les gars, merci beaucoup, mais je n'ai vraiment mentionné nulle part il devrait y avoir des totaux, il devrait être juste toute la liste des transactions. – user1324100

+1

@ user1324100 - Comme Frank l'a souligné lorsque vous avez posé cette question sur OTN https://forums.oracle.com/forums/thread.jspa?threadID=2373681&tstart=0 il serait très utile de poster des structures de table, des exemples de données, et la sortie attendue. Donc vous voulez toutes les transactions réelles plus une fausse transaction pour n'importe quelle combinaison de 'company_name' et' transaction_type' qui n'a pas de transactions réelles? –

Questions connexes