2016-05-06 24 views
6

creo le seguenti tabelle:Come selezionare un cliente specifico?

create table customers (
     ID  varchar(9), 
     name varchar(15), 
     CONSTRAINT pk_id PRIMARY KEY (ID) 
); 

create table living_places (
     code varchar(7), 
     ID  varchar(9), 
     CONSTRAINT pk_code PRIMARY KEY (code) 
); 

create table policies (
     code_policy   varchar(7), 
     code_living_place varchar(7), 
     CONSTRAINT pk_code_policy PRIMARY KEY (code_policy) 
); 

create table bills (
     code   varchar(7), 
     code_policy varchar(7), 
     paid_out  boolean, 
     CONSTRAINT pk_code_bill PRIMARY KEY (code) 
); 

ho inserito le seguenti date:

insert into customers(ID, name) values('fx1','Louis'); 
insert into customers(ID, name) values('fx2','Peter'); 
insert into customers(ID, name) values('fx3','Alice'); 

insert into living_places(code, ID) values('001','fx1'); 
insert into living_places(code, ID) values('002','fx2'); 
insert into living_places(code, ID) values('003','fx1'); 
insert into living_places(code, ID) values('004','fx3'); 

insert into policies(code_policy, code_living_place) values('p1','001'); 
insert into policies(code_policy, code_living_place) values('p2','002'); 
insert into policies(code_policy, code_living_place) values('p3','003'); 

insert into bills(code, code_policy, paid_out) values('b1','p1','1'); 
insert into bills(code, code_policy, paid_out) values('b2','p1','1'); 
insert into bills(code, code_policy, paid_out) values('b3','p2','0'); 
insert into bills(code, code_policy, paid_out) values('b4','p2','1'); 
insert into bills(code, code_policy, paid_out) values('b5','p3','0'); 
insert into bills(code, code_policy, paid_out) values('b6','p3','1'); 

La domanda è: come selezionare quelle persone che hanno tutte le loro politiche a pagamento?

Il mio problema è che Louis ha due politiche p1 e p3. Politica p1 è pagato ma non lo è p3.

La mia domanda:

select ID from living_places where code in (
select code from living_places where code in (
select code_living_place from policies where code_policy in (
select code_policy from bills where paid_out=1 and code_policy not in (
select code_policy from bills where paid_out=0)))); 

MySQL me tornare:

+------+ 
| ID | 
+------+ 
| fx1 | 
+------+ 

P.S: Louis non hanno tutte le politiche pagati. Ad esempio, la bolletta b5 non viene pagata.

+0

C'è letteralmente 0 persone nel tuo esempio che avranno tutte le loro politiche pagato. Dal momento che non includi nemmeno la terza persona nel tuo esempio (non esiste una politica 004, quindi nessun riferimento alla persona fx3) e tutti gli altri hanno almeno una bolletta non pagata. – Dresden

+0

esattamente! @MikeS – Python241820

risposta

2

Penso che dovrebbe essere questo:

select name 
from customers 
where id not in ( 
    select iving_places.id 
    from living_places 
    inner join policies on policies.code_living_place = living_places.code 
    inner join bills on (bills.code_policy = policies.code and bills.paid_out=0) 
); 
+0

Ma ho bisogno delle persone che hanno TUTTE le politiche pagate. , cioè, nessuna persona in questo caso. Grazie per la risposta – Python241820

+0

fx1 aveva pagato tutte le polizze .. – scaisEdge

+0

No @scaisEdge, perché la polizza "P3" è da "Louis" e il conto "b5" ha paid_out = "0". E fx1 = "Louis" – Python241820

1

Vuoi dire questo?

select c.ID from customers c 
    join living_places l 
    on l.ID = c.ID 
    join policies p 
    on p.code_living_place = l.code 
    join bills b 
    on b.code_policy = p.code_policy 
where paid_out = 0 
group by c.ID 
+0

Si potrebbe voler aggiungere un 'DISTINCT' o altrimenti gestire casi in cui un cliente deve su più di una politica. –

+0

Hai ragione @TomH –

1
I take it you want customer who have policies paid out i.e paid_out=1? 
If yes, this following should do: 

select c.ID, c.name 
from customers c, living_places l, policies p 
where c.ID = l.ID 
and l.code = p.code_living_place 
and p.code_policy not in (select distinct b.code_policy 
          from bills b 
          where b.paid_out = '0') 

Ecco la SQL Fiddle dove si possono vedere i risultati.

MODIFICA: questa query funzionerà quando il cliente ha una politica pari a zero o zero (vale a dire una o zero case). La query richiede attenzione per> 1 casa/politica.

+0

Ma MYSQL restituisce "Louis" e "Peter" e non hanno tutte le fatture pagate. – Python241820

+0

@ Python241820, ah ok ho perso l'ultima parte. Permettimi di modificare la mia soluzione. – MSameer

+0

"Louis" ha due case con 2 polizze e una di queste non è pagata affatto – Python241820

2

abbastanza sicuro che sia questo:

select c.ID, c.name 
from customers c 
where c.ID in (
    select lp.id 
    from policies p 
    join living_places lp on p.code_living_place = lp.code 
    join bills b on b.code_policy = p.code_policy 
    group by lp.id 
    having sum(b.paid_out = 1) = count(*)); 

restituisce 0 record con i dati che si hanno attualmente e se si modifica la banconota da un Luigi non ha pagato a pagamento allora apparirà nei risultati.

Here's a SQL Fiddle to play around with.

+0

Un'idea davvero carina da usare con la somma (b.paid_out = 1) = count (*) – MSameer

0

dispiace per il posto ripetuta, la risposta è stata:

SELECT x.name 
FROM 
(SELECT c.name, SUM(CASE WHEN b.paid_out THEN 0 ELSE 1 END) all_paid 
FROM customers c JOIN living_places l ON c.ID = l.ID 
JOIN policies p ON l.code = p.code_living_place 
JOIN bills b ON p.code_policy = b.code_policy 
GROUP BY c.name) x 
WHERE x.all_paid = 0; 

risposta da @ Davide Bachmann Jeppesen: Select a specific customer in MYSQL?