I have three tables as below.
Table 1:
╔═════════════════════╗
║ Country_table ║
╠══════════════╦══════╣
║ Country_Name ║ Code ║
╠══════════════╬══════╣
║ India ║ 1 ║
╠══════════════╬══════╣
║ UK ║ 2 ║
╠══════════════╬══════╣
║ france ║ 3 ║
╠══════════════╬══════╣
║ germany ║ 4 ║
╚══════════════╩══════╝
Table 2 :
╔════════════════════════════════════════════════════════════════════════════════╗
║ Trade_Details ║
╠═════════╦═══════════╦═════════════╦═══════════╦══════════╦════════╦════════════╣
║ TradeID ║ ProductID ║ FromCountry ║ ToCountry ║ Curruncy ║ Amount ║ Date ║
╠═════════╬═══════════╬═════════════╬═══════════╬══════════╬════════╬════════════╣
║ T1 ║ P1 ║ 1 ║ 3 ║ INR ║ 10 ║ 01/01/2020 ║
╠═════════╬═══════════╬═════════════╬═══════════╬══════════╬════════╬════════════╣
║ T2 ║ P2 ║ 3 ║ 2 ║ USD ║ 11 ║ 10/01/2020 ║
╠═════════╬═══════════╬═════════════╬═══════════╬══════════╬════════╬════════════╣
║ T3 ║ P1 ║ 1 ║ 4 ║ GBP ║ 12 ║ 20/01/2020 ║
╠═════════╬═══════════╬═════════════╬═══════════╬══════════╬════════╬════════════╣
║ T4 ║ P2 ║ 2 ║ 3 ║ INR ║ 13 ║ 21/01/2020 ║
╠═════════╬═══════════╬═════════════╬═══════════╬══════════╬════════╬════════════╣
║ T5 ║ P1 ║ 1 ║ 4 ║ USD ║ 14 ║ 22/01/2020 ║
╠═════════╬═══════════╬═════════════╬═══════════╬══════════╬════════╬════════════╣
║ T6 ║ P2 ║ 4 ║ 2 ║ GBP ║ 15 ║ 23/01/2020 ║
╠═════════╬═══════════╬═════════════╬═══════════╬══════════╬════════╬════════════╣
║ T7 ║ P1 ║ 3 ║ 1 ║ INR ║ 16 ║ 24/01/2020 ║
╠═════════╬═══════════╬═════════════╬═══════════╬══════════╬════════╬════════════╣
║ T8 ║ P2 ║ 3 ║ 1 ║ USD ║ 17 ║ 25/01/2020 ║
╠═════════╬═══════════╬═════════════╬═══════════╬══════════╬════════╬════════════╣
║ T9 ║ P1 ║ 2 ║ 3 ║ GBP ║ 18 ║ 26/01/2020 ║
╠═════════╬═══════════╬═════════════╬═══════════╬══════════╬════════╬════════════╣
║ T10 ║ P2 ║ 1 ║ 4 ║ INR ║ 19 ║ 27/01/2020 ║
╠═════════╬═══════════╬═════════════╬═══════════╬══════════╬════════╬════════════╣
║ T11 ║ P1 ║ 3 ║ 1 ║ USD ║ 20 ║ 28/01/2020 ║
╠═════════╬═══════════╬═════════════╬═══════════╬══════════╬════════╬════════════╣
║ T12 ║ P2 ║ 1 ║ 1 ║ GBP ║ 21 ║ 29/01/2020 ║
╠═════════╬═══════════╬═════════════╬═══════════╬══════════╬════════╬════════════╣
║ T13 ║ P1 ║ 2 ║ 2 ║ INR ║ 22 ║ 30/01/2020 ║
╚═════════╩═══════════╩═════════════╩═══════════╩══════════╩════════╩════════════╝
Table 3:
╔═══════════════════════════════════════════════════════╗
║ TradeStatus_Table ║
╠═════════╦════════════╦═══════════════════╦════════════╣
║ TradeID ║ StatusCode ║ StatusDescription ║ Date ║
╠═════════╬════════════╬═══════════════════╬════════════╣
║ T1 ║ inProcess ║ Reached HUB1 ║ 01/01/2020 ║
╠═════════╬════════════╬═══════════════════╬════════════╣
║ T1 ║ inProcess ║ Reached HUB2 ║ 01/01/2020 ║
╠═════════╬════════════╬═══════════════════╬════════════╣
║ T1 ║ inProcess ║ Reached HUB3 ║ 01/01/2020 ║
╠═════════╬════════════╬═══════════════════╬════════════╣
║ T1 ║ delivered ║ delivered ║ 01/01/2020 ║
╠═════════╬════════════╬═══════════════════╬════════════╣
║ T2 ║ inProcess ║ Reached HUB1 ║ 10/01/2020 ║
╠═════════╬════════════╬═══════════════════╬════════════╣
║ T2 ║ inProcess ║ Reached HUB2 ║ 10/01/2020 ║
╠═════════╬════════════╬═══════════════════╬════════════╣
║ T2 ║ inProcess ║ Reached HUB3 ║ 10/01/2020 ║
╠═════════╬════════════╬═══════════════════╬════════════╣
║ T2 ║ Returned ║ returned to home ║ 10/01/2020 ║
╠═════════╬════════════╬═══════════════════╬════════════╣
║ T3 ║ inProcess ║ Reached HUB1 ║ 20/01/2020 ║
╠═════════╬════════════╬═══════════════════╬════════════╣
║ T3 ║ inProcess ║ Reached HUB2 ║ 20/01/2020 ║
╠═════════╬════════════╬═══════════════════╬════════════╣
║ T3 ║ inProcess ║ Reached HUB3 ║ 20/01/2020 ║
╠═════════╬════════════╬═══════════════════╬════════════╣
║ T3 ║ inProcess ║ Reached HUB4 ║ 20/01/2020 ║
╠═════════╬════════════╬═══════════════════╬════════════╣
║ T3 ║ inProcess ║ Reached HUB5 ║ 20/01/2020 ║
╚═════════╩════════════╩═══════════════════╩════════════╝
Output tables :
Delivered : This column represents the total number of transactions final status as either delivered or returned.
InProcess : This column represents the total number of transactions doesn't contains final status as either delivered or returned.
╔═════════════════════════════════════════════════════════════════════╗
║ Report 1 (example) ║
╠═════════════╦═══════════╦═══════════╦═══════════╦═══════════════════╣
║ FromCountry ║ ToCountry ║ Delivered ║ inProcess ║ Description ║
╠═════════════╬═══════════╬═══════════╬═══════════╬═══════════════════╣
║ India ║ UK ║ 1 ║ 1 ║ total transactions║
╠═════════════╬═══════════╬═══════════╬═══════════╬═══════════════════╣
║ UK ║ India ║ 2 ║ 1 ║ total transactions║
╠═════════════╬═══════════╬═══════════╬═══════════╬═══════════════════╣
║ France ║ India ║ 2 ║ 1 ║ total transactions║
╚═════════════╩═══════════╩═══════════╩═══════════╩═══════════════════╝
No of Trades : This column contains Total number of transactions were made between from country and to country.
Total Trade Value :- This column contains Total sum of value of the transactions made between from country and to country based on currency type.
╔═══════════════════════════════════════════════════════════════════════╗
║ Report 2 (example) ║
╠═════════════╦═══════════╦══════════════╦══════════╦═══════════════════╣
║ FromCountry ║ ToCountry ║ No of Trades ║ Currency ║ Total Trade Value ║
╠═════════════╬═══════════╬══════════════╬══════════╬═══════════════════╣
║ India ║ UK ║ 2 ║ INR ║ 1000 ║
╠═════════════╬═══════════╬══════════════╬══════════╬═══════════════════╣
║ India ║ UK ║ 1 ║ USD ║ 10 ║
╠═════════════╬═══════════╬══════════════╬══════════╬═══════════════════╣
║ UK ║ India ║ 2 ║ GBP ║ 10 ║
╠═════════════╬═══════════╬══════════════╬══════════╬═══════════════════╣
║ France ║ India ║ 1 ║ INR ║ 20 ║
╚═════════════╩═══════════╩══════════════╩══════════╩═══════════════════╝
I have tried many combinations but not able to figure out the required output. Please help me on this.
first query, But not able to accommodate inprocess message count.
select source.Country_name, destination.country_name, count(*)
from Trade_Details, Country_table source, Country_table destination
where date > '2020/01/01 00:00:00'
and date <'2020/02/01/ 00:00:00'
and FromCountry = source.code
and ToCountry =destination.code
group by source.Country_name, destination.country_name
2nd query ,
select source.Country_name as source, destination.country_name as destination, count(*) as inprocessCount
from Trade_Details a1, Country_table source, Country_table destination
where date > '2020/01/01 00:00:00'
and date <'2020/02/01/ 00:00:00'
and FromCountry = source.code
and ToCountry =destination.code
and 0=(select count(*) from Trade_Details a2 where (a2.StatusCode='delivered' or a2.StatusCode='Returned') and a1.TradeID=a2.TradeID)
group by source.Country_name, destination.country_name
QUESTION :
Basically i would like merge both query outputs to get it in a single query. But failed to achive. If possible could you please help me on these two reports.
regards,
Ks
Report 1 Solution Here !!!
SELECT source.country_name AS FromCountry,
destination.country_name AS ToCountry,
Count(Trdsts1.statuscode) AS Delivered,
Count(Trdsts2.statuscode) AS inProcess,
'no of messages' AS Description
FROM trade_details Trddts,
tradestatus_table Trdsts1,
tradestatus_table Trdsts2,
country_table source,
country_table destination
WHERE Trddts.date > '2020/01/01 00:00:00'
AND Trddts.date < '2020/02/01/ 00:00:00'
AND Trdsts1.tradeid = Trddts.tradeid
AND Trdsts2.tradeid = Trddts.tradeid
AND Trdsts1.statuscode = "delivered"
AND Trdsts2.statuscode ="inprocess"
AND source.code = Trddts.fromcountry
AND destination.code = Trddts.tocountry
Related
I have a schema of a database where we have a a user table and several fact tables.
The schema is goes something like this:
╔════════════╗
║ USERS ║
╠════════════╣
║ sales_id ║ PK
║ traveler_id║ PK
╚════════════╝
╔════════════╗
║ Sales ║
╠════════════╣
║ sales_id ║ --> FK to User sales_id PK
║ date ║
║ metric_1 ║
║ metric_2 ║
╚════════════╝
╔════════════╗
║ Travels ║
╠════════════╣
║ traveler_id║ --> FK to User traveler_id PK
║ date ║
║ metric_3 ║
║ metric_4 ║
╚════════════╝
I'm trying to join them as a single fact table to get all the metrics and their dates in a inqle query. It would return something like below:
╔════════════╦══════════════╦══════════╦══════════╦══════════╦══════════╦══════════╗
║ sales_id ║ traveler_id ║ date ║ metric_1 ║ metric_2 ║ metric_3 ║ metric_4 ║
╠════════════╬══════════════╬══════════╬══════════╬══════════╬══════════╬══════════╣
║ 1 ║ A ║ Jan ║ x1 ║ a1 ║ null ║ null ║
║ 1 ║ A ║ Feb ║ x2 ║ a2 ║ null ║ null ║
║ 1 ║ A ║ Jan ║ x3 ║ a3 ║ b1 ║ null ║
║ 2 ║ B ║ Mar ║ x4 ║ a4 ║ null ║ c1 ║
╚════════════╩══════════════╩══════════╩══════════╩══════════╩══════════╩══════════╝
Here is the sql I wrote:
select
coalesce(s.date, t.date) as date,
s.sales_id,
t.traveler_id,
max(coalesce(s.metric_1, 0)) as metric_1,
max(coalesce(s.metric_2, 0)) as metric_2,
max(coalesce(t.metric_3, 0)) as metric_3,
max(coalesce(t.metric_4, 0)) as metric_4,
from users as u
full join sales as s on (u.sales_id = s.sales_id)
full join travels as t on (u.traveler_id = t.traveler_id)
group by 1, 2, 3
However, my joining logic ends up returning the same values for the rows that are as null.
╔════════════╦══════════════╦══════════╦══════════╦══════════╦══════════╦══════════╗
║ sales_id ║ traveler_id ║ date ║ metric_1 ║ metric_2 ║ metric_3 ║ metric_4 ║
╠════════════╬══════════════╬══════════╬══════════╬══════════╬══════════╬══════════╣
║ 1 ║ A ║ Jan ║ x1 ║ a1 ║ b1 ║ null ║
║ 1 ║ A ║ Feb ║ x2 ║ a2 ║ b1 ║ null ║
║ 1 ║ A ║ Jan ║ x3 ║ a3 ║ b1 ║ null ║
║ 2 ║ B ║ Mar ║ x4 ║ a4 ║ null ║ null ║
╚════════════╩══════════════╩══════════╩══════════╩══════════╩══════════╩══════════╝
My suspicion is that it's due to the second full join. I would assume I could break these down into two other joins, and match their id, but I'm having a hard time trying to understand how to incorporate the dates, properly.
select
coalesce(s.date, t.date) as date,
s.sales_id,
t.traveler_id,
max(coalesce(s.metric_1, 0)) as metric_1,
max(coalesce(s.metric_2, 0)) as metric_2,
max(coalesce(t.metric_3, 0)) as metric_3,
max(coalesce(t.metric_4, 0)) as metric_4
from users as u
left join sales as s on (u.sales_id = s.sales_id and s.date = coalesce(s.date, t.date))
left join travels as t on (u.traveler_id = t.traveler_id and t.date = coalesce(s.date, t.date))
group by 1, 2, 3
This is what the table looks like:
╔════════════╦══════════════╦══════════╦══════════╦══════════╦══════════╦══════════╗
║ sales_id ║ traveler_id ║ date ║ metric_1 ║ metric_2 ║ metric_3 ║ metric_4 ║
╠════════════╬══════════════╬══════════╬══════════╬══════════╬══════════╬══════════╣
║ 1 ║ A ║ Jan ║ x1 ║ a1 ║ b1 ║ null ║
║ 1 ║ A ║ Feb ║ x2 ║ a2 ║ null ║ null ║
║ 1 ║ A ║ Jan ║ x3 ║ a3 ║ b1 ║ null ║
║ 2 ║ B ║ Mar ║ x4 ║ a4 ║ null ║ c1 ║
╚════════════╩══════════════╩══════════╩══════════╩══════════╩══════════╩══════════╝
Hi i have postgres database and four tables
vehicles -> trips
vehicles -> component_values -> component_types
vehicles:
╔════╦══════════════════════════╦════════════════════════╦════════════════╦═════════╗
║ id ║ slug ║ name ║ manufacturer ║ model ║
╠════╬══════════════════════════╬════════════════════════╬════════════════╬═════════╣
║ 1 ║ manufacturer-x-model-3 ║ Manufacturer X Model 3 ║ Manufacturer X ║ Model 3 ║
║ 2 ║ manufacturer-x-model-1 ║ Manufacturer X Model 1 ║ Manufacturer X ║ Model 1 ║
║ 3 ║ manufacturer-x-model-1-1 ║ Manufacturer X Model 1 ║ Manufacturer X ║ Model 1 ║
╚════╩══════════════════════════╩════════════════════════╩════════════════╩═════════╝
trips:
╔═════╦════════════╦═════════════╦═════════════╦═════════════════╗
║ id ║ vehicle_id ║ name ║ mileage ║ recorded_at ║
╠═════╬════════════╬═════════════╬═════════════╬═════════════════╣
║ 1 ║ 1 ║ 10386735 ║ 386734.997 ║ 2/25/2014 13:56 ║
║ 2 ║ 1 ║ 11771530.14 ║ 771530.14 ║ 3/1/2014 19:41 ║
║ 3 ║ 1 ║ 121112028.4 ║ 1112028.39 ║ 3/5/2014 3:23 ║
║ 4 ║ 1 ║ 131406814.9 ║ 1406814.892 ║ 3/8/2014 20:56 ║
║ 5 ║ 1 ║ 141933528.7 ║ 1933528.711 ║ 3/13/2014 0:19 ║
║ 6 ║ 1 ║ 152256488.6 ║ 2256488.579 ║ 3/16/2014 21:15 ║
╚═════╩════════════╩═════════════╩═════════════╩═════════════════╝
component_values:
╔════╦═══════════════════╦═════════╦════════════╦════════════╦═════════════╦═════════════╗
║ id ║ component_type_id ║ trip_id ║ vehicle_id ║ mileage ║ damage ║ damage_eff ║
╠════╬═══════════════════╬═════════╬════════════╬════════════╬═════════════╬═════════════╣
║ 1 ║ 1 ║ 1 ║ 1 ║ 386734.997 ║ 0.002260565 ║ 0.002225831 ║
║ 2 ║ 2 ║ 1 ║ 1 ║ 386734.997 ║ 0.002260306 ║ 0.002238006 ║
║ 3 ║ 3 ║ 1 ║ 1 ║ 386734.997 ║ 0.002261288 ║ 0.002266295 ║
║ 4 ║ 4 ║ 1 ║ 1 ║ 386734.997 ║ 0.002054489 ║ 0.002060029 ║
║ 5 ║ 5 ║ 1 ║ 1 ║ 386734.997 ║ 0.002052669 ║ 0.002107272 ║
║ 6 ║ 6 ║ 1 ║ 1 ║ 386734.997 ║ NULL ║ NULL ║
║ 7 ║ 7 ║ 1 ║ 1 ║ 386734.997 ║ NULL ║ NULL ║
║ 8 ║ 1 ║ 2 ║ 1 ║ 771530.14 ║ 0.004792952 ║ 0.0048514 ║
║ 9 ║ 2 ║ 2 ║ 1 ║ 771530.14 ║ 0.004792404 ║ 0.004710451 ║
║ 10 ║ 3 ║ 2 ║ 1 ║ 771530.14 ║ 0.004794486 ║ 0.004805461 ║
╚════╩═══════════════════╩═════════╩════════════╩════════════╩═════════════╩═════════════╝
component_types:
╔════╦═════════════════════════════════════╦════════════════╦══════════════════════╗
║ id ║ slug ║ manufacturer ║ name ║
╠════╬═════════════════════════════════════╬════════════════╬══════════════════════╣
║ 6 ║ manufacturer-d-battery ║ Manufacturer D ║ Battery ║
║ 2 ║ manufacturer-b-differential-1 ║ Manufacturer B ║ Differential 1 ║
║ 3 ║ manufacturer-c-driveshaft-1 ║ Manufacturer C ║ Driveshaft 1 ║
║ 5 ║ manufacturer-c-gearbox-output-shaft ║ Manufacturer C ║ Gearbox output shaft ║
║ 1 ║ manufacturer-a-motor-1 ║ Manufacturer A ║ Motor 1 ║
║ 4 ║ manufacturer-c-gearbox-input-shaft ║ Manufacturer C ║ Gearbox input shaft ║
║ 7 ║ usage-profile ║ ║ Usage profile ║
╚════╩═════════════════════════════════════╩════════════════╩══════════════════════╝
and i'm trying to get the vehicles with the latest trip dates and mileage and also the heights and lowest damaged component for each vehicle
so the result will be like:
╔════════════╦══════════════════╦══════════════════════════╦═════════════════════════════════╦════════════════════════════════╦════════════════════════════════╦═══════════════════════════════╗
║ vehicle_id ║ latest_trip_date ║ latest_trip_date_mileage ║ heights_damaged_component_value ║ heights_damaged_component_name ║ lowest_damaged_component_value ║ lowest_damaged_component_name ║
╠════════════╬══════════════════╬══════════════════════════╬═════════════════════════════════╬════════════════════════════════╬════════════════════════════════╬═══════════════════════════════╣
║ 1 ║ 4/19/2014 3:27 ║ 4844305.912 ║ 0.029372972 ║ Gearbox input shaft ║ 0.002052669 ║ Gearbox output shaft ║
║ 2 ║ 5/19/2014 16:13 ║ 5567945.164 ║ 0.029405924 ║ Driveshaft 1 ║ 0.001864137 ║ Gearbox output shaft ║
║ 3 ║ 4/28/2014 12:55 ║ 5286175.763 ║ 0.030745029 ║ Driveshaft 1 ║ 0.001957685 ║ Differential 1 ║
║ 4 ║ 2/25/2014 3:32 ║ 5398006.007 ║ 0.030495792 ║ Driveshaft 1 ║ 0.001814434 ║ Differential 1 ║
║ 5 ║ 4/25/2014 9:51 ║ 5179558.475 ║ 0.032060074 ║ Gearbox input shaft ║ 0.001936431 ║ Differential 1 ║
║ 6 ║ 5/9/2014 7:43 ║ 5234355.804 ║ 0.030576454 ║ Gearbox input shaft ║ 0.002254191 ║ Gearbox output shaft ║
║ 7 ║ 6/21/2014 18:09 ║ 5705722.416 ║ 0.029957374 ║ Driveshaft 1 ║ 0.001653441 ║ Gearbox output shaft ║
║ 8 ║ 4/23/2014 5:25 ║ 5590470.028 ║ 0.031900163 ║ Driveshaft 1 ║ 0.002083733 ║ Gearbox output shaft ║
║ 9 ║ 3/28/2014 20:37 ║ 5598159.883 ║ 0.031208918 ║ Driveshaft 1 ║ 0.00162805 ║ Differential 1 ║
║ 10 ║ 5/24/2014 19:27 ║ 5020795.001 ║ 0.02962505 ║ Gearbox input shaft ║ 0.001729646 ║ Differential 1 ║
╚════════════╩══════════════════╩══════════════════════════╩═════════════════════════════════╩════════════════════════════════╩════════════════════════════════╩═══════════════════════════════╝
i already tried this query
select
vehicles.id as vehicle_id,
latest_trips.recorded_at as latest_trip_date,
latest_trips.mileage as latest_trip_date_mileage,
heights_damaged_components.damage as heights_damaged_component_value,
heights_damaged_components.name as heights_damaged_component_name,
lowest_damaged_components.damage as lowest_damaged_component_value,
lowest_damaged_components.name as lowest_damaged_component_name
from vehicles
left join (
SELECT t.id, t.vehicle_id, t.mileage, t.recorded_at
FROM public.trips t
inner JOIN (SELECT vehicle_id, MAX(recorded_at) as latest_trip_date FROM public.trips GROUP BY vehicle_id)
tm ON t.vehicle_id = tm.vehicle_id AND t.recorded_at = tm.latest_trip_date
)
as latest_trips on latest_trips.vehicle_id = vehicles.id
left join (
select ct.name, hd.component_type_id, hd.vehicle_id, hd.damage
from public.component_values as hd
INNER JOIN (
SELECT vehicle_id,
MAX(damage) as heights_damaged_component
FROM public.component_values
GROUP BY vehicle_id
)
hdm ON hd.vehicle_id = hdm.vehicle_id AND hd.damage = hdm.heights_damaged_component
join public.component_types as ct on ct.id = hd.component_type_id
)
as heights_damaged_components on heights_damaged_components.vehicle_id = vehicles.id
left join (
select ct.name, ld.component_type_id, ld.vehicle_id, ld.damage
from public.component_values as ld
INNER JOIN (
SELECT vehicle_id, MIN(damage) as lowest_damaged_component
FROM public.component_values
GROUP BY vehicle_id
)
ldm ON ld.vehicle_id = ldm.vehicle_id AND ld.damage = ldm.lowest_damaged_component
join public.component_types as ct on ct.id = ld.component_type_id
) as lowest_damaged_components on lowest_damaged_components.vehicle_id = vehicles.id
but i have like 10000 vehicles and big trips and component_values and this query give me the result in like 3 to 6 seconds, is their a batter way to do this with better performance and time?
can i use GENERATED columns in my case and how ?
please any help and many many thanks in advance.
Suppose we have the following data in the table named My_Tabel:
╔═══════════╦═════════════╦════════════╗
║ ID ║ Person_Name ║ Partner_ID ║
╠═══════════╬═════════════╬════════════╬
║ 101 ║ John ║ 3 ║
║ 100 ║ Miller ║ 0 ║
║ 3 ║ Ruby ║ 101 ║
║ 180 ║ Jack ║ 0 ║
║ 199 ║ George ║ 65 ║
║ 23 ║ Joseph ║ 0 ║
║ 34 ║ Fredrick ║ 117 ║
║ 117 ║ Jinan ║ 34 ║
║ 122 ║ Verena ║ 0 ║
║ 65 ║ Mary ║ 199 ║
╚═══════════╩═════════════╩════════════╝
Where 0 values in Partner_ID Column indicates that he/she is single.
We need to display partnered persons without repeating or duplication, the desired result should look like:
╔═════════════╦══════════════╗
║ Person_Name ║ Partner_Name ║
╠═════════════╬══════════════╬
║ John ║ Ruby ║
║ George ║ Mary ║
║ Fredrick ║ Jinan ║
╚═════════════╩══════════════╝
what is the best SQL query that returns the above results?
I'm using this code:
SELECT
t1.Name, t2.Name
FROM My_Tabel t1
INNER JOIN My_Tabel t2 ON (t2.ID = t1.Partner_ID)
but it the returned result is:
╔═════════════╦══════════════╗
║ Person_Name ║ Partner_Name ║
╠═════════════╬══════════════╬
║ John ║ Ruby ║
║ Ruby ║ John ║
║ George ║ Mary ║
║ Mary ║ George ║
║ Fredrick ║ Jinan ║
║ Jinan ║ Fredrick ║
╚═════════════╩══════════════╝
how the SQL statement should be updated (or replaced with another) to get the desired results?
Just add a condition to get one side of each pair:
SELECT t1.Name, t2.Name
FROM My_Table t1 INNER JOIN
My_Table t2
ON (t2.ID = t1.Partner_ID)
WHERE t1.ID < t2.ID;
I have two tables, EVENT and EVENT_REV
EVENT:
╔══════════╦════════════════════╗
║ EVENT_ID ║ SENT_INTO_WF_BY_ID ║
╠══════════╬════════════════════╣
║ 1 ║ null ║
║ 2 ║ null ║
║ 3 ║ null ║
║ 4 ║ null ║
║ 5 ║ null ║
╚══════════╩════════════════════╝
and EVENT_REV:
╔══════════════╦══════════╦═════════╦════════╦════════════╦══════════╗
║ EVENT_REV_ID ║ EVENT_ID ║ USER_ID ║ STATUS ║ VALID_FROM ║ VALID_TO ║
╠══════════════╬══════════╬═════════╬════════╬════════════╬══════════╣
║ 1 ║ 1 ║ 54 ║ 0 ║ 1000 ║ 1001 ║
║ 2 ║ 1 ║ 55 ║ 100 ║ 2000 ║ 2001 ║
║ 3 ║ 1 ║ 56 ║ 200 ║ 3000 ║ 3001 ║
║ 4 ║ 2 ║ 57 ║ 0 ║ 4000 ║ 4001 ║
║ 5 ║ 3 ║ 58 ║ 0 ║ 5000 ║ 5001 ║
║ 6 ║ 3 ║ 59 ║ 100 ║ 6000 ║ null ║
║ 7 ║ 4 ║ 60 ║ 0 ║ 7000 ║ null ║
║ 8 ║ 5 ║ 61 ║ 500 ║ 8000 ║ 8001 ║
║ 9 ║ 5 ║ 62 ║ 600 ║ 9000 ║ 9001 ║
╚══════════════╩══════════╩═════════╩════════╩════════════╩══════════╝
I want to update the EVENT table and set the SENT_INTO_WF_BY_ID
The rule for this is:
event_ids should match (EVENT.EVENT_ID = EVENT_REV.EVENT_ID)
take the row where STATUS is not equal to the STATUS with the lowest VALID_FROM. Which should be the row with the second lowest VALID_FROM
From that row, take the USER_ID
For example:
For the EVENT_ID = 1 it should select the 2nd row from EVENT_REV and put the USER_ID 55 into the SENT_INTO_WF_BY_ID
Because inner joins are not allowed for H2, my query looks like this:
UPDATE event ltm
SET ltm.sent_into_wf_by_id =
(SELECT top 1 ltmRev.user_id
FROM event_rev ltmRev
WHERE ltmRev.event_id = ltm.event_id
AND ltmRev.status !=
(SELECT top 1 EVENT_REV.status
FROM EVENT_REV
ORDER BY valid_from ASC nulls LAST)
ORDER BY ltmRev.valid_to ASC nulls LAST)
The result should look like:
╔══════════╦════════════════════╗
║ EVENT_ID ║ SENT_INTO_WF_BY_ID ║
╠══════════╬════════════════════╣
║ 1 ║ 55 ║
║ 2 ║ null ║
║ 3 ║ 59 ║
║ 4 ║ null ║
║ 5 ║ 62 ║
╚══════════╩════════════════════╝
but it's actually:
╔══════════╦════════════════════╗
║ EVENT_ID ║ SENT_INTO_WF_BY_ID ║
╠══════════╬════════════════════╣
║ 1 ║ 55 ║
║ 2 ║ null ║
║ 3 ║ 59 ║
║ 4 ║ null ║
║ 5 ║ 61 <-- wrong ║
╚══════════╩════════════════════╝
Could solve it with the following query:
UPDATE ltm_op_risk_event ltm
SET ltm.sent_into_wf_by_id =
(SELECT ltmRev.adm_user_id
FROM ltm_op_risk_event_rev ltmRev
WHERE ltmRev.ltm_op_risk_event_id = ltm.ltm_op_risk_event_id
AND ltmRev.status !=
(SELECT ltmRev2.status
FROM LTM_OP_RISK_EVENT_REV ltmRev2
WHERE valid_from IS NOT NULL
AND ltmRev.ltm_op_risk_event_id = ltmRev2.ltm_op_risk_event_id
ORDER BY valid_from ASC LIMIT 1)
ORDER BY ltmRev.valid_to ASC LIMIT 1)
WHERE ltm.sent_into_wf_by_id IS NULL;
The missing part was the AND ltmRev.ltm_op_risk_event_id = ltmRev2.ltm_op_risk_event_id in the innermost select. I first tested this connection with the wrong connections...
I have 2 tables, and I am trying to match up the data but all the answers have suggested right joins or full joins, which are not available on SQLite.
Table 1:
╔═════════╦═════════╦══════╗
║ Company ║ Product ║ Cost ║
╠═════════╬═════════╬══════╣
║ A ║ abc ║ 100 ║
║ B ║ abc ║ 150 ║
║ F ║ xyz ║ 250 ║
║ G ║ xyz ║ 300 ║
╚═════════╩═════════╩══════╝
However I have a list of more companies (with same products)
Table 2:
╔═════════╦═════════╗
║ Product ║ Company ║
╠═════════╬═════════╣
║ abc ║ A ║
║ abc ║ B ║
║ abc ║ C ║
║ abc ║ D ║
║ abc ║ E ║
║ abc ║ F ║
║ abc ║ G ║
║ xyz ║ A ║
║ xyz ║ B ║
║ xyz ║ C ║
║ xyz ║ D ║
║ xyz ║ E ║
║ xyz ║ F ║
║ xyz ║ G ║
╚═════════╩═════════╝
How do I match them up so they look like this?
Table 3:
╔═════════╦═════════╦══════╗
║ Product ║ Company ║ Cost ║
╠═════════╬═════════╬══════╣
║ abc ║ A ║ 100 ║
║ abc ║ B ║ 150 ║
║ abc ║ C ║ null ║
║ abc ║ D ║ null ║
║ abc ║ E ║ null ║
║ abc ║ F ║ null ║
║ abc ║ G ║ null ║
║ xyz ║ A ║ null ║
║ xyz ║ B ║ null ║
║ xyz ║ C ║ null ║
║ xyz ║ D ║ null ║
║ xyz ║ E ║ null ║
║ xyz ║ F ║ 250 ║
║ xyz ║ G ║ 300 ║
╚═════════╩═════════╩══════╝
When I use this code,
SELECT Company, t.Product, Cost
FROM table1 as t INNER JOIN table2 as f ON t.product = f.product
WHERE t.company = f.company
it only returns [Company] with an associated [Product] and [Cost], but does not return [Company] with null values.
When I use
SELECT Company, t.Product, Cost
FROM table1 as t INNER JOIN table2 as f ON t.company = f.company
then my output looks like
╔═══════════╦═══════════╦═════════╗
║ t.Company ║ f.Company ║ Product ║
╠═══════════╬═══════════╬═════════╣
║ A ║ A ║ abc ║
║ B ║ A ║ abc ║
║ F ║ A ║ abc ║
║ G ║ A ║ abc ║
║ A ║ B ║ abc ║
║ B ║ B ║ abc ║
║ F ║ B ║ abc ║
║ G ║ B ║ abc ║
║ A ║ C ║ abc ║
║ B ║ C ║ abc ║
║ F ║ C ║ abc ║
║ G ║ C ║ abc ║
╚═══════════╩═══════════╩═════════╝
Any help will be much appreciated. Thank you!
SQLite does support LEFT OUTER JOIN, which should do the job just fine:
select two.product, two.company, one.cost from two
left outer join one on
((one.company = two.company) and (one.product = two.product));
(where two is your "table 2" and one is your "table 1")
Running this in SQLite with the above data:
abc|A|100
abc|B|150
abc|C|
abc|D|
abc|E|
abc|F|
abc|G|
xyz|A|
xyz|B|
xyz|C|
xyz|D|
xyz|E|
xyz|F|250
xyz|G|300