2017-12-18 4 views
-1

Ich habe drei Tabellen financial_year, house_details, consumer_details. Ich muss die Summe jeder Steuergruppe nach Jahr und Subincome erhalten. Meine Tabelle und Abfrage ist in diesem Link: sqlfiddleSumme der Gruppe mit mysql

Anfahrt Ergebnis:

Name house_number address subincome financial_year gtax htax LTAX 
-------------------------------------------------------------------------- 
Bala 22   Mumbai Garbage tax 2015-2016  200 NULL NULL 
Bala 22   Mumbai Garbage tax 2016-2017  250 NULL NULL 
Bala 22   Mumbai House tax 2015-2016  NULL 0  NULL 
Bala 22   Mumbai House tax 2016-2017  NULL 145 NULL 
Bala 22   Mumbai Light tax 2015-2016  NULL NULL 510 
Bala 22   Mumbai Light tax 2016-2017  NULL NULL 200 

Expecting Ergebnis:

Name house_number address gtax htax LTAX 
-------------------------------------------------------- 
Bala 22    Mumbai  450  145  710 
+1

Fügen Sie Ihr Ergebnis als Text, nicht Bild. Manche Leute können keine Bilder sehen. –

+0

Link ist zu Image nicht sqlfiddle. –

+0

@ P.Salmon ja ich aktualisiert bitte überprüfen. –

Antwort

1

Sie suchen nach bedingten Aggregationshinweis Diese Lösung funktioniert nur, wenn für jedes Geschäftsjahr ein Eintrag für jedes Untereinkommen (Steuerart) in den Hausdetails vorhanden ist.

SELECT c.consumer_name as Name, c.house_number, c.address, 
sum(CASE WHEN h.subincome = 'Garbage tax' THEN f.garbage_tax else 0 end) - 
sum(CASE WHEN h.subincome = 'Garbage tax' THEN h.rupees else 0 END) as gtax, 
sum(CASE WHEN h.subincome = 'House tax' THEN f.house_tax else 0 end) - 
sum(CASE WHEN h.subincome = 'House tax' THEN h.rupees else 0 END) as htax, 
sum(CASE WHEN h.subincome = 'Light tax' THEN f.light_tax else 0 end) - 
sum(CASE WHEN h.subincome = 'Light tax' THEN h.rupees else 0 END) as LTAX 
from house_details h 
INNER JOIN financial_year f ON h.financial_year = f.year AND h.house_id = f.house_number 
INNER JOIN consumer_details c ON h.house_id = c.house_number AND h.financial_year != '2017-2018' 
group by c.consumer_name , c.house_number, c.address 

Ergebnis

+------+--------------+---------+------+------+------+ 
| Name | house_number | address | gtax | htax | LTAX | 
+------+--------------+---------+------+------+------+ 
| Bala | 22   | Mumbai | 450 | 145 | 710 | 
+------+--------------+---------+------+------+------+ 
1 row in set (0.03 sec) 

Wenn es nicht garantiert, dass es für jedes subincome in jedem Geschäftsjahr ein Eintrag dann die die Lösung aus der fälligen Steuer-Tabelle (Geschäftsjahr) angetrieben werden, hat was meiner Ansicht nach schlecht entworfen, unflexibel ist und eine sub optimale Lösung zwingt

select c.consumer_name as Name, s.house_number, c.address, 
     sum(case when subincome = 'garbage tax' then taxdue else 0 end) - sum(case when subincome = 'garbage tax' then taxpaid else 0 end) as gtax, 
     sum(case when subincome = 'house tax' then taxdue else 0 end) - sum(case when subincome = 'house tax' then taxpaid else 0 end) as htax, 
     sum(case when subincome = 'light tax' then taxdue else 0 end) - sum(case when subincome = 'light tax' then taxpaid else 0 end) as ltax 
from 
(
SELECT F.`house_number`, F.`year`, F.`house_tax` taxdue, F.`createdAt`, F.`updatedAt`,ifnull(h.subincome,'house_tax') subincome,ifnull(H.RUPEES,0) taxpaid 
FROM FINANCIAL_YEARS F 
LEFT JOIN house_details H ON H.HOUSE_ID = F.HOUSE_NUMBER AND H.SUBINCOME = 'house tax' and f.year = h.financial_year 
#where f.house_number = 22 
union all 
SELECT F.`house_number`, F.`year`, F.`light_tax`, F.`createdAt`, F.`updatedAt`,ifnull(h.subincome,'light tax'),ifnull(H.RUPEES,0) 
FROM FINANCIAL_YEARS F 
LEFT JOIN house_details H ON H.HOUSE_ID = F.HOUSE_NUMBER AND H.SUBINCOME = 'light tax' and f.year = h.financial_year 
#where f.house_number = 2 
union all 
SELECT F.`house_number`, F.`year`, F.`garbage_tax`, F.`createdAt`, F.`updatedAt`,ifnull(h.subincome,'garbage tax'),ifnull(H.RUPEES,0) 
FROM FINANCIAL_YEARS F 
LEFT JOIN house_details H ON H.HOUSE_ID = F.HOUSE_NUMBER AND H.SUBINCOME = 'garbage tax' and f.year = h.financial_year 
#where f.house_number = 2 
) s 
join consumer_details c on s.house_number = c.house_number 
where s.year <> '2017-2018' 
group by c.consumer_name , s.house_number, c.address 
+0

Danke Lachs. –

+1

Bitte überprüfen Sie die aktualisierte Antwort. Übrigens möchten Sie vielleicht einige Ihrer Tabellen- und Spaltennamen ändern, um sie aussagekräftiger zu machen. –

+0

können Sie bitte erklären, wofür das Steuerwertfeld verwendet wird. –

1

dieses Probieren Sie es genaue Ergebnis geben wird, die Sie wollen, ich schaffe nur ein Laufwerk Tabelle und dann Summe

SELECT name 
    , house_number 
    , address 
    , SUM(gtax) as gtax 
    , SUM(htax) as htax 
    , SUM(LTAX) LTAX 
FROM (SELECT c.consumer_name as Name 
      , c.house_number 
      , c.address,h.subincome 
      , h.financial_year 
      , CASE WHEN h.subincome = 'Garbage tax' THEN f.garbage_tax - sum(h.rupees)END as gtax 
      , CASE WHEN h.subincome = 'House tax' THEN f.house_tax - sum(h.rupees) END as htax 
      , CASE WHEN h.subincome = 'Light tax' THEN f.light_tax - sum(h.rupees) END as LTAX 
     FROM house_details h 
      INNER JOIN financial_year f ON h.financial_year = f.year AND h.house_id = f.house_number 
      INNER JOIN consumer_details c ON h.house_id = c.house_number AND h.financial_year != '2017-2018' 
     GROUP BY h.subincome, h.financial_year) as main 
GROUP BY house_number 

dann Ergebnis ist: Screenshot of result