2017-08-04 1 views
0

Je essaie de créer une vue dans une base de données Postgres ce tableau:SQL CREATE VIEW avec dans et CHOISIT

|----|------|------|--------|--------|--------|--------| 
| id | t1_n | t2_n | value1 | value2 | value3 | valueX | 
|----|------|------|--------|--------|--------|--------| 
| 1 | A | X | 12 | 2 | 1 | .. | 
| 2 | B | Y | 2 | 2 | 20 | .. | 
| 3 | C | Z | 41 | 1 | 1 | .. | 
| 4 | A | Z | 43 | 3 | 4 | .. | 
| 5 | B | Y | 15 | 5 | 1 | .. | 
| 6 | C | X | 52 | 2 | 5 | .. | 
| 7 | .. | .. | .. | .. | .. | .. | 
|----|------|------|--------|--------|--------|--------| 

Dans la vue, chaque zone doit être saisi avec chaque division existante. Les colonnes suivantes contiennent les résultats de SELECTS individuels.

Vue:

|----|------|------|------|------|------|------| 
| id | t1_n | t2_n | sum1 | sum2 | sum3 | sum4 | 
|----|------|------|------|------|------|------| 
| 1 | A | X | .. | .. | .. | .. | 
| 2 | A | Y | .. | .. | .. | .. | 
| 3 | A | Z | .. | .. | .. | .. | 
| 1 | B | X | .. | .. | .. | .. | 
| 2 | B | Y | .. | .. | .. | .. | 
| 3 | B | Z | .. | .. | .. | .. | 
| 1 | C | X | .. | .. | .. | .. | 
| 2 | C | Y | .. | .. | .. | .. | 
| 3 | C | Z | .. | .. | .. | .. | 
| 3 | .. | .. | .. | .. | .. | .. | 
|----|------|------|------|------|------|------| 

sum1 devrait être:

SELECT sum(value1) FROM table1 WHERE t1_n = [current_t1_n] AND t2_n = [current_t2_n]; 

SUM2 devrait être:

SELECT sum(value2) FROM table1 WHERE t1_n = [current_t1_n] AND t2_n = [current_t2_n]; 

SUM3 devrait être:

SELECT sum(value3) FROM table1 WHERE t1_n = [current_t1_n] AND t2_n = [current_t2_n]; 

peut-être quelque chose comme ça:

for(t1_n){ 
    for(t2_n){ 
    set sum1, sum2, sum3, sumX...}} 

thx pour l'aide

Répondre

0

Calculer les sommes que les sous-requêtes, et se joindre à ces sous-requêtes à une liste de toutes les colonnes communes. Voici un exemple du modèle:

select 
    k.t1_n, 
    k.t2_n, 
    sum1, 
    sum2 
from 
    (select distinct t1_n, t2n from table1) as k 
    left join (
     select t1_n, t2_n, sum(value1) as sum1 
     from table1 
     group by t1_n, t2_n 
     ) as s1 using (t1_n, t2_n) 
    left join (
     select t1_n, t2_n, sum(value2) as sum2 
     from table1 
     group by t1_n, t2_n 
     ) as s2 using (t1_n, t2_n) 
; 

Vous allez vraisemblablement l'étendre pour les colonnes et les sommes supplémentaires. Si votre table n'a aucune valeur manquante, vous pouvez utiliser des jointures internes à la place.

+0

thx, cela fonctionne. je le change en jointure interne pour les valeurs nulles – Kirbylix