Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

SQL Server result with one query

I have the example below and I am experimenting with joins to come up with a specific result

declare @stay_days table
(on_date    datetime)

declare @occupancy table
(on_date    datetime,
 type_id    numeric(10,0),
 phase      char(1))

declare @rate_room_type_details table
(type_id    numeric(10,0)   null)

insert @stay_days
select '2023-06-01'

insert @occupancy
select '2023-05-31',8,'D'

insert @occupancy
select '2023-06-01',8,'D'

insert @occupancy
select '2023-06-02',5,'D'

insert @occupancy
select '2023-06-03',8,'D'

insert @rate_room_type_details
select 1

insert @rate_room_type_details
select 2

insert @rate_room_type_details
select 3

insert @rate_room_type_details
select 4

insert @rate_room_type_details
select 5

insert @rate_room_type_details
select 6

insert @rate_room_type_details
select 7

insert @rate_room_type_details
select 8

I have tried this query

SELECT b.type_id,a.on_date,count(*)
FROM @occupancy a
RIGHT OUTER JOIN @stay_days c
ON a.on_date = c.on_date
RIGHT JOIN @rate_room_type_details b
ON a.type_id = b.type_id
AND a.phase IN ('I','D','A') 
GROUP BY b.type_id,a.on_date

but the result I get is

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

type_id on_date (No column name)
1       NULL       1
2       NULL       1
3       NULL       1
4       NULL       1
5       NULL       1
6       NULL       1
7       NULL       1
8       2023-06-01 1

which does not fill in the dates and th count is not zero.
The result I am after is the one below which displays all the type_IDs, has the common date instrad of the NULL and have count as 0 in all type_IDs except 8 which actually exists

type_id     on_date  (No column name)
    1       2023-06-01 0
    2       2023-06-01 0
    3       2023-06-01 0
    4       2023-06-01 0
    5       2023-06-01 0
    6       2023-06-01 0
    7       2023-06-01 0
    8       2023-06-01 1

Any help appreciated

>Solution :

Something like this perhaps:

SELECT b.type_id,c.on_date,count(a.on_date)
FROM @stay_days c
cross join @rate_room_type_details b
left join @occupancy a
    ON  a.on_date = c.on_date
    and a.type_id = b.type_id
    AND a.phase IN ('I','D','A') 
GROUP BY b.type_id,c.on_date

I switched around the joins a bit and change to CROSS JOIN because i guess @stay_days and @rate_room_type_details is your base and @occupancy is the details

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading