2013-12-16 10 views
6

Sto cercando di ottenere la somma totale per mesi di net_insurance durante la vita di una politica.Come posso creare una query complessa che somma le condizioni con 2 tabelle?

Ecco il mio politiche tavolo:

ID  date_ini  date_expired num_policy 
1,  '2013-01-01', '2014-03-08', 1234  
2,  '2012-02-11', '2013-02-01', 5678 
3,  '2013-03-01', '2013-08-03', 9123 
4,  '2013-04-01', '2013-08-01', 4567 
5,  '2013-05-01', '2013-09-01', 8912 

Ecco la mia tabella di assicurazioni

ID  initial_date  final_date policy_id net_insurance 
1,  '2013-01-16', '2014-01-01',  1,  1000  
2,  '2013-01-14', '2014-03-06',  1,  1400 
3,  '2012-03-17', '2013-04-24',  2,  2000 
4,  '2012-02-12', '2013-02-01',  2,  2500 
5,  '2013-03-09', '2013-08-20',  3,  3000 
6,  '2013-03-11', '2013-08-02',  3,  4000 

Sarà somma in base a questa condizione (durante la vita di una politica).

WHERE insurances.initial_date >= policies.date_ini 
    AND insurances.final_date <= policies.date_expired      

Secondo con la condizione che dovrebbe avere questo:

ID NUM_POLICY SUM_INSURANCE 
    1 1234    2400 
    2 5678    2500 
    3 9123    4000 
    4 4567    0 
    5 8912    0 

questo farà:

|jan| |feb| |mar| |apr| |may| |jun| |jul| |ago| |sep| |oct| |nov| |dec| 
    2400 2400 2400 2400 2400 2400 2400 2400 2400 2400 2400 2400 
    2500 2500 _______________________________________________________________ 
    ______________4000 4000 4000 4000 4000 4000 ________________________ 
    _______________________0 0  0  0 0 ________________________ 
    ____________________________0  0  0 0  0______________________ 

Ecco il risultato finale facendo la somma totale di ogni mese:

|jan| |feb| |mar| |apr| |may |jun| |jul| |ago| |sep| |oct| |nov| |dec| 
    4900 4900 6400 6400 6400 6400 6400 6400 2400 2400 2400 2400 

Ma è non funziona la mia domanda che sto avendo un altro valori:

JAN FEB MAR  APR  MAY  JUN JUL AUG  SEP  OCT  NOV DEC 
8900 8900 8900 8900 8900 8900 8900 8900 8900 8900 8900 8900 

Ecco quello che ho provato http://sqlfiddle.com/#!2/e75ea/1

Si prega di qualcuno mi può aiutare con questo?

Apprezzerò molto l'aiuto.

+0

Si vuole ottenere il totale di 'net_insurance' di tutto' insurance' record che erano totalmente in effetti durante la vita di una politica? Sembra ragionevole. Hai un tavolo 'Date'? Il tuo pivoting manuale mi fa incrociare gli occhi. –

+0

I primi due collegamenti funzionano bene, grazie. Avete una tabella che memorizza i campi relativi alla data? Ecco alcuni articoli: http://www.techrepublic.com/blog/the-enterprise-cloud/simplify-sql-server-2005-queries-with-a-dates-table/326/ http: // sqlserverplanet. com/dba/create-date-table Tale tabella dovrebbe salvarti dalla logica di data ingombrante che hai abbozzato. –

+0

C'è un solo record nei dati campione in cui un evento assicurativo si verifica interamente all'interno di una polizza (l'evento assicurativo n. 1 è compreso nel periodo di politica n. 1). Questo record è escluso dal filtro (in Fiddle) che la politica deve iniziare e terminare nel 2013. Sei sicuro di questi filtri? Forse avrebbe senso filtrare le date di inizio degli eventi piuttosto che le date di inizio e fine? –

risposta

3

Si può provare con questa query:

SET @year := 2013; 

SELECT 
SUM(if (CONCAT(@year, '-01') BETWEEN date_format(date_ini, '%Y-%m') AND date_format(date_expired, '%Y-%m'),i.net_insurance, 0)) Jan, 
SUM(if (CONCAT(@year, '-02') BETWEEN date_format(date_ini, '%Y-%m') AND date_format(date_expired, '%Y-%m'),i.net_insurance, 0)) Feb, 
SUM(if (CONCAT(@year, '-03') BETWEEN date_format(date_ini, '%Y-%m') AND date_format(date_expired, '%Y-%m'),i.net_insurance, 0)) Mar, 
SUM(if (CONCAT(@year, '-04') BETWEEN date_format(date_ini, '%Y-%m') AND date_format(date_expired, '%Y-%m'),i.net_insurance, 0)) Apr, 
SUM(if (CONCAT(@year, '-05') BETWEEN date_format(date_ini, '%Y-%m') AND date_format(date_expired, '%Y-%m'),i.net_insurance, 0)) May, 
SUM(if (CONCAT(@year, '-06') BETWEEN date_format(date_ini, '%Y-%m') AND date_format(date_expired, '%Y-%m'),i.net_insurance, 0)) Jun, 
SUM(if (CONCAT(@year, '-07') BETWEEN date_format(date_ini, '%Y-%m') AND date_format(date_expired, '%Y-%m'),i.net_insurance, 0)) Jul, 
SUM(if (CONCAT(@year, '-08') BETWEEN date_format(date_ini, '%Y-%m') AND date_format(date_expired, '%Y-%m'),i.net_insurance, 0)) Aug, 
SUM(if (CONCAT(@year, '-09') BETWEEN date_format(date_ini, '%Y-%m') AND date_format(date_expired, '%Y-%m'),i.net_insurance, 0)) Sep, 
SUM(if (CONCAT(@year, '-10') BETWEEN date_format(date_ini, '%Y-%m') AND date_format(date_expired, '%Y-%m'),i.net_insurance, 0)) Oct, 
SUM(if (CONCAT(@year, '-11') BETWEEN date_format(date_ini, '%Y-%m') AND date_format(date_expired, '%Y-%m'),i.net_insurance, 0)) Nov, 
SUM(if (CONCAT(@year, '-12') BETWEEN date_format(date_ini, '%Y-%m') AND date_format(date_expired, '%Y-%m'),i.net_insurance, 0)) `Dec` 

FROM insurances i 
INNER JOIN policies p ON p.id = i.policy_id 
WHERE (i.initial_date >= p.date_ini 
    AND i.final_date <= p.date_expired) 
    ; 
+0

test .......... =) –

+0

ha funzionato, ma puoi aiutarmi con un'ultima cosa per favore? –

+0

Ok. se posso ... – gieffe

2

cobbling insieme tuo post, le modifiche, i commenti e SQL violino, e fare un certo numero di tentativi, suona come avete bisogno di qualcosa di simile:

SELECT 
    LEFT(DATE_FORMAT(I.initial_date, '%M'), 3) AS Month, 
    SUM(I.net_insurance) AS Insurance 
FROM 
    insurances AS I 
    INNER JOIN policies AS P ON I.policy_id = P.id 
WHERE 
     YEAR(P.date_ini) = 2013 
    AND YEAR(P.date_expired) = 2013 
GROUP BY 
    LEFT(DATE_FORMAT(I.initial_date, '%M'), 3) 

Per quanto riguarda ruotare i dati risultanti, che è purtroppo piuttosto ingombrante in MySQL. È coperto altrove su SO (MySQL pivot table).

+0

per favore riesci a leggere di nuovo tutto il mio post? ho aggiunto dettagli di dati fissi e anche fatto una query ma non sta facendo la somma correttamente –

+0

Ecco cosa voglio http://sqlfiddle.com/#!2/e75ea/1 ma non sta facendo una somma corretta –

+0

@CarlitosMorales: I ho letto più volte il tuo post, ma non è del tutto specifico. "Non sta facendo la somma correttamente" è estremamente vaga. Ti suggerisco di ricominciare con una chiara spiegazione di ciò che desideri ottenere, includere la bozza di query e una spiegazione di come la bozza non soddisfa il risultato previsto. Se non altro, devi chiarire se stai chiedendo come aggregare i dati o come ruotarli. –

Problemi correlati