2017-12-22 14 views
1

私は3つのテーブルfinancial_years、house_details、consumer_detailsを持っています。私はSqlfiddleで私のスキーマを追加しました:http://sqlfiddle.com/#!9/dd527d/2と私の期待された結果は、以下の長さのためにラップされます。私が試したクエリがあります。joinとgroupを使用して3つのテーブルから値を取得する

問合せ:

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 

期待される結果:

:数字が予想よりも大きい場合は、ここでの説明と何をすべきかの手がかりが

sid | name | house_no | address | arrears 
--------------------------------------------------------------------- 
            house_tax | light_tax | garbage_tax 
--------------------------------------------------------------------- 
22 Bala 22   Mumbai 145   710   450 
25 Kannan 25   Pune  704   803   630 
2  Arul 2   Delhi  60   570   590 

current        | total 
------------------------------------------------------------------------ 
house_tax | light_tax | garbage_tax | house_tax | light_tax | garbage_tax 
------------------------------------------------------------------------ 
300   400   500   445   1110  950 
550   567   543   1254  1370  1173 
700   800   900   760   1370  1490 

receipt_no       | collection 
------------------------------------------------------------------------ 
house_tax | light_tax | garbage_tax | house_tax | light_tax | garbage_tax 
------------------------------------------------------------------------ 
312,313,314 309,310,311 288,304,308 400   540   484 
407,408,409 404,405,406 401,402,403 921   915   905         
410   -    -   500   0   0 

balance 
------------------------------------ 
house_tax | light_tax | garbage_tax 
------------------------------------ 
45   570   466   
333   455   268   
260   1370  1490   
+1

あなたの期待した結果のリンクは私にとっては機能しません。質問に直接入力と出力のサンプルを表示し、各行に4つ以上の先行スペースがあるコードとしてフォーマットされた完全な質問をしてください。 –

+1

ここに期待した結果を質問に投稿してください。サンプルデータの期待される結果のみが提供されます。 –

+1

Fiddlesと望みの結果は素晴らしいですが、質問にも貼り付けるので、このページから移動する必要はありません。 – Strawberry

答えて

0

私は私の質問のための解決策を見つけました。

SELECT 
    sid, 
    NAME, 
    housenu AS house_number, 
    addr AS Address, 
    htax AS Arrear_housetax, 
    ltax AS Arrear_lighttax, 
    gtax AS Arrear_garbagetax, 
    chousetax AS Current_housetax, 
    clighttax AS Current_lighttax, 
    cgarbage AS Current_garbagetax, 
    htax + chousetax AS totalhousetax, 
    ltax + clighttax AS totallighttax, 
    gtax + cgarbage AS totalgarbagetax, 
    housetax_Ids, 
    Garbagetax_ids, 
    lighttax_Ids, 
    htax_collected AS Collected_housetax, 
    LTAX_collected AS Collected_lighttax, 
    gtax_collected AS Collected_garbagetax, 
    totalhousetax - htax_collected AS balance_housetax, 
    totallighttax - LTAX_collected AS balance_Lighttax, 
    totalgarbage - gtax_collected AS balance_garbagetax 
FROM 
    (
    SELECT 
     sid, 
     NAME, 
     housenu, 
     addr, 
     gtax, 
     htax, 
     ltax, 
     cgarbage, 
     chousetax, 
     clighttax, 
     gtax + cgarbage AS totalgarbage, 
     htax + chousetax AS totalhousetax, 
     ltax + clighttax AS totallighttax, 
     Garbagetax_ids, 
     lighttax_Ids, 
     housetax_Ids, 
     gtax_collected, 
     htax_collected, 
     LTAX_collected 
    FROM 
     (
     SELECT 
      sid, 
      c.consumer_name AS NAME, 
      s.house_number AS housenu, 
      c.address AS addr, 
      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, 
cgarbage, 
chousetax, 
clighttax, 
Garbagetax_ids, 
lighttax_Ids, 
housetax_Ids, 
gtax_collected, 
htax_collected, 
LTAX_collected 
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 
LEFT JOIN(
    SELECT house_number, 
     IFNULL(garbage_tax, 0) AS cgarbage, 
     IFNULL(light_tax, 0) AS clighttax, 
     IFNULL(house_tax, 0) AS chousetax 
    FROM 
     financial_years 
    WHERE 
     YEAR = "2017-2018" 
) Y 
ON 
    s.house_number = Y.house_number 
LEFT JOIN(
    SELECT 
     house_id, 
     GROUP_CONCAT(garbagetax_Ids) AS Garbagetax_ids, 
     GROUP_CONCAT(lighttax_Ids) AS Lighttax_ids, 
     GROUP_CONCAT(housetax_Ids) AS Housetax_ids 
    FROM 
     (
     SELECT 
      house_id, 
      CASE WHEN subincome = 'Garbage tax' THEN receipt_id 
    END AS garbagetax_Ids, 
    CASE WHEN subincome = 'Light tax' THEN receipt_id 
END AS lighttax_Ids, 
CASE WHEN subincome = 'House tax' THEN receipt_id 
END AS housetax_Ids 
FROM 
    house_details 
) AS mm 
GROUP BY 
    house_id 
) f 
ON 
    s.house_number = f.house_id 
LEFT JOIN(
    SELECT 
     house_id, 
     SUM(gtax) AS gtax_collected, 
     SUM(htax) AS htax_collected, 
     SUM(LTAX) AS LTAX_collected 
    FROM 
     (
     SELECT 
      house_id, 
      CASE WHEN h.subincome = 'Garbage tax' THEN SUM(h.rupees) ELSE 0 
    END AS gtax, 
    CASE WHEN h.subincome = 'House tax' THEN SUM(h.rupees) ELSE 0 
END AS htax, 
CASE WHEN h.subincome = 'Light tax' THEN SUM(h.rupees) ELSE 0 
END AS LTAX 
FROM 
    house_details h 
GROUP BY 
    house_id, 
    subincome 
) AS main 
GROUP BY 
    house_id 
) cf 
ON 
    s.house_number = cf.house_id 

LEFT JOIN(
    SELECT house_number AS sid, 
     consumer_name, 
     address 
    FROM 
     consumer_details 
) c 
ON 
    s.house_number = c.sid 
WHERE 
    s.year <> '2017-2018' 
GROUP BY 
    c.consumer_name, 
    s.house_number, 
    c.address 
) az 
) aa 
1

ですJOINingの場合、中間行の数が増えます。その後、行の数が収縮します(GROUP BY)。問題は、集計(例:SUM())が膨大な行数で実行されることです。

したがって、JOINを実行する前にSUMsを実行することです。何かを試してみてください

SELECT ... -- probably no SUM() needed here 
    FROM (SELECT financial_year, house_id, 
        SUM(...), SUM(...) ... FROM house_details 
       GROUP BY 1,2) AS h 
    JOIN (SELECT year, house_number, 
        SUM(...), SUM(...) ... FROM financial_years 
       GROUP BY 1,2) AS f 
     ON h.financial_year = f.year 
     AND h.house_id = f.house_number 

私はあなたが最後にGROUP BYが必要と思わないと思います。

customer_nameなどを取得するには、余分なJOINが必要な場合があります。また、オプションのORDER BY customer_nameもあります。

1

ここに私が持っているものがあります。それは私が信じている正しい結果を生成します。

SELECT c.consumer_id, c.consumer_name, c.house_number, c.address, 
    SUM(GTAX) AS GTAX, SUM(HTAX) AS HTAX, SUM(LTAX) AS LTAX 
FROM 
(
SELECT c.address, c.consumer_id, c.consumer_name, c.house_number, hd.financial_year, 
    sum(ifnull(f.garbage_tax,0))-ifnull((SELECT SUM(RUPEES) RUPEES FROM house_details h WHERE hd.financial_year=h.financial_year and c.house_number=h.house_id and h.SUBINCOME='Garbage tax'),0) AS gtax, 
    sum(ifnull(f.house_tax,0))-ifnull((SELECT SUM(RUPEES) RUPEES FROM house_details h WHERE hd.financial_year=h.financial_year and c.house_number=h.house_id and h.SUBINCOME='House tax'),0) AS htax, 
    sum(ifnull(f.light_tax,0))-ifnull((SELECT SUM(RUPEES) RUPEES FROM house_details h WHERE hd.financial_year=h.financial_year and c.house_number=h.house_id and h.SUBINCOME='Light tax'),0) AS ltax 
from consumer_details c 
cross join (select distinct hd.financial_year from house_details hd where hd.financial_year<>'2017-2018') hd 
LEFT OUTER JOIN financial_years f ON c.house_number=f.house_number and f.year=hd.financial_year 
    where c.house_number in (select h.house_id from house_details h) 
group by consumer_id, consumer_name, c.house_number, hd.financial_year 
) c 
group by c.consumer_id, c.consumer_name, c.house_number, c.address 
     ,c.house_number 
     ,c.address 
+0

私はそれを編集して今すぐ家の詳細を持っていないレコードをフィルタリングします。 – Ctznkane525

関連する問題