Iam Using postgreSQL. I have 2 table with relations
table customer:
-------------------------------------------
| customer_id (PK) | first_name | last_name |
-------------------------------------------
| 1 | ogi | tampoo |
| 2 | cimol | comet |
| 3 | cocang | tampoo |
| 4 | bedu | comet |
| 5 | bonjof | tampoo |
table transaction:
---------------------------------------------------------
| transaction_id (PK) | customer_id (FK) | total_value |
---------------------------------------------------------
| 2 | 1 | 250500 |
| 5 | 2 | 340600 |
| 4 | 3 | 150800 |
| 6 | 4 | 90900 |
| 3 | 4 | 1009000 |
| 1 | 5 | 540700 |
| 7 | 4 | 340000 |
question:
Return all customer who has >1 record transaction.
Obviously from transaction table, customer_id = 4 have 3 records
how to query this?
Desired result
--------------------------------------------------------------------------------------
| customer_id | first_name | last_name | transaction_id | customer_id | total_value |
--------------------------------------------------------------------------------------
| 4 | bedu | comet | 5 | 4 | 90900 |
| 4 | bedu | comet | 3 | 4 | 1009000 |
| 4 | bedu | comet | 7 | 4 | 340000 |
what I've try:
select cs.* ,tr.*
from
customer cs
left join
transaction tr
on tr.customer_id = cs.customer_id
group by cs.customer_id , tr.transaction_id
having count(cs.customer_id)>1
select *
from
customer cs
left join
transaction tr
on tr.customer_id = cs.customer_id
group by tr.customer_id
having count(tr.customer_id)>1
It appear that (i dont know if it only postgres), It forced to group by each PRIMARY KEY .
When I try to group by any other column which is not PK, it return error and demand the PK for group by .
Thank you very much.
Your last query almost works. Just select the columns from the customer table -- and join by the primary key:
select c.*
from customer c join
transaction t
on t.customer_id = c.customer_id
group by c.customer_id
having count(*) > 1
If you want any columns from t
, then you need to use an aggregation function. For instance COUNT(*)
to count the number of transactions.
Also note that I changed the LEFT JOIN
to an INNER JOIN
. You require a match in order to meet the HAVING
condition, so the outer join is not needed.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.