Reputation: 2027
I'm having trouble getting the result out of my query. I want to fetch the sum and total count of an unit sale in transactions, where the transaction is in a specific zip.
Here are my tables:
TABLE unit_type(
id (Primary key)
unit_name (varchar)
department_id (Foreign key)
)
TABLE transaction(
id (PK)
commission_fix_out (int)
transaction_end_week (int)
property_id (FK)
unit_type_id (FK)
...
)
TABLE property(
id (PK)
property_zip_id (FK)
...
)
My unit_types table has the following records:
+-----+----------------------+----------------+
| id | unit_name | department_id |
+-----+----------------------+----------------+
| 1 | WV construction | 1 |
| 2 | WV resale | 1 |
| 3 | WV rent | 1 |
| 4 | BV industrial sale | 2 |
| 5 | BV industrial rent | 2 |
| ... | ... | ... |
+-----+----------------------+----------------+
Here's how my query looks like:
SELECT SUM(commission_fix_out), COUNT(commission_fix_out), unit_name, ut.id
FROM unit_type as ut
LEFT JOIN transaction as t
ON ut.id = t.unit_type_id
RIGHT JOIN property as p
ON (p.id = t.property_id AND p.property_zip_id = 1459)
WHERE ut.department_id = 1
GROUP BY unit_name
ORDER BY ut.id
which results in:
+------------+-------------+-------------+---------+
| SUM(...) | COUNT(..) | unit_name | ut.id |
+------------+-------------+-------------+---------+
| 40014 | 11 | WV resale | 2 |
| NULL | 0 | WV rent | 3 |
+------------+-------------+-------------+---------+
I was expecting another row with WV construction, but it doesn't show up. Anyone who knows where i am wrong with this one?
Upvotes: 4
Views: 3147
Reputation: 2027
I managed to fix my problem. I'd like to share my result with you:
SELECT SUM(commission_fix_out), COUNT(commission_fix_out), unit_name
FROM unit_type ut
LEFT JOIN transaction t
ON (ut.id = t.unit_type_id AND t.property_id IN (SELECT id FROM property p WHERE
property_zip_id = 1459))
WHERE department_id = 1
GROUP BY unit_name
ORDER BY ut.id
Instead of using an extra JOIN, i'd tried using a subquery in my ON-clause which gives my next results:
+-----------+-----------+-------------------+------+
| SUM(..) | COUNT() | unit_name | id |
+-----------+-----------+-------------------+------+
| NULL | 0 | WV construction | 1 |
| 40014 | 11 | WV resale | 2 |
| NULL | 0 | WV rent | 3 |
+-----------+-----------+-------------------+------+
I'd like to thank everyone helping me to fix this question.
Upvotes: 1
Reputation: 263683
try this:
SELECT SUM(commission_fix_out),
COUNT(commission_fix_out),
unit_name,
ut.id
FROM unit_type as ut
LEFT JOIN `transaction` as t
ON ut.id = t.unit_type_id
LEFT JOIN `property` p
ON p.id = t.property_id
WHERE ut.department_id = 1 AND
p.property_zip_id = 1459
GROUP BY unit_name, p.property_zip_id -- added another column
ORDER BY ut.id
UPDATE 1
SELECT *
FROM
(
(
SELECT SUM(commission_fix_out) total_fix_out,
COUNT(commission_fix_out) count_fix_out,
unit_name,
ut.id
FROM unit_type as ut
LEFT JOIN `transaction` as t
ON ut.id = t.unit_type_id
LEFT JOIN `property` p
ON p.id = t.property_id
WHERE ut.department_id = 1 AND
p.property_zip_id = 1459
GROUP BY unit_name, p.property_zip_id -- added another column
ORDER BY ut.id
) tableA
UNION
(
SELECT 0 as total_fix_out,
0 as count_fix_out,
unit_name,
id
FROM unit_type
WHERE id NOT IN
(
SELECT DISTINCT xx.id
FROM unit_type as xx
LEFT JOIN `transaction` as t
ON xx.id = t.unit_type_id
LEFT JOIN `property` p
ON p.id = t.property_id
WHERE xx.department_id = 1 AND
p.property_zip_id = 1459
)
) tableA
) tableC
Upvotes: 0
Reputation: 302
I think it's the right join cause the problem.
try this :
SELECT SUM(commission_fix_out), COUNT(commission_fix_out), unit_name, ut.id
FROM unit_type as ut
LEFT JOIN transaction as t
ON ut.id = t.unit_type_id
WHERE ut.department_id = 1
GROUP BY unit_name
ORDER BY ut.id
what is the result ?
Upvotes: 0
Reputation: 2257
That Right Join will effectively undo the point of the LEFT JOIN before it
Upvotes: 0
Reputation: 16037
This may not solve the problem, but why RIGHT JOIN property
?
LEFT JOIN property
instead would make more sense.
You see, transaction
table is already LEFT JOIN
ed to the unit_type
which I assume is the base table of this query.
Upvotes: 0