Disaggregating Data Using SQL

46 views Asked by At

I have 3 tables:

Table 1:

Column A Column B Column D
A1 B1 5.455626797
A1 B2 4.474291714
A2 B1 9.96811376
A2 B2 5.462867002

Table 2:

Column A Column C Column D
A1 C1 3.313957532
A1 C2 6.615960979
A2 C1 9.782949121
A2 C2 5.648031641

Table 3:

Column B Column C Column D
B1 C1 10.76037672
B1 C2 4.663363842
B2 C1 2.336529937
B2 C2 7.600628779

How can I use these 3 tables to deaggregate the data back into it's original form. RAW Data:

Column A Column B Column C Column D
A1 B1 C1 1.41704499
A1 B1 C2 4.038581807
A1 B2 C1 1.896912542
A1 B2 C2 2.577379172
A2 B1 C1 9.343331726
A2 B1 C2 0.6247820347
A2 B2 C1 0.4396173952
A2 B2 C2 0.4396173952

I tried using some generic disaggregating queries, but column D was never accurately disaggregated.

Examples:

1)

SELECT t1.A, t1.B, t2.C, 
  CASE 
    WHEN t3.C IS NULL THEN t1.D - t2.D 
    WHEN t1.B = t2.C THEN 0 
    ELSE t1.D + t3.D - t2.D 
  END AS D
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.A = t2.A
LEFT JOIN Table3 t3 ON t1.B = t3.B AND t2.C = t3.C
ORDER BY A, B, C;
SELECT t1.A, t1.B, t2.C, 
  CASE 
    WHEN t3.C IS NULL THEN t1.D - t2.D 
    WHEN t1.B = t2.C THEN COALESCE(t3.D, 0)
    ELSE t1.D + COALESCE(t3.D, 0) - t2.D 
  END AS D
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.A = t2.A
LEFT JOIN Table3 t3 ON (t1.B = t3.B AND t2.C = t3.C) OR (t1.B = t2.C)
ORDER BY A, B, C;
0

There are 0 answers