I’m trying to retrieve the status for a multi-step process which is stored in a sql server db. Each step is a record in a table.
When a client wants to know the status of that process, I would like to retrieve the statusses for all steps and have my query return a status of
- ‘queued’ when all steps have status ‘queued’,
- ‘in-progress’ when one of the steps has status ‘in-progress’,
- ‘finished’ when all of the steps have status ‘finished’.
What would this query look like?
I’m not that experienced in Sql yet so I haven’t tried anything yet because I wouldn’t know where to start and can’t really find anything like this problem on Google.
Edit based on comment:
Tables look like:
Process
- id uniqueidentifier not null pk
- other stuff
Step
- id uniqueidentifier not null pk
- processId uniqueidentifier not null fk with process.id
- status nvarchar(30) not null
So some sample data for step would be:
id | processId | status |
---|---|---|
ed9d1f80-1941-495a-a282-833fddf41174 | 6f940376-27b5-4899-8cf0-beb89877da46 | in-progress |
2738a403-7ad4-4396-9b5c-c641bc01f96f | 6f940376-27b5-4899-8cf0-beb89877da46 | queued |
4e6a0c8e-49e9-4dc6-adbe-a74f27aff36f | 6f940376-27b5-4899-8cf0-beb89877da46 | queued |
which should result in my query returning:
processId | status |
---|---|
6f940376-27b5-4899-8cf0-beb89877da46 | in-progress |
>Solution :
You can check using the following query:
DECLARE @pid int = 7; --whatever the ID of this process is.
SELECT
CASE
WHEN EXISTS (SELECT 1 FROM ProcessSteps WHERE ProcessID = @pid AND Status = 'in-progress') THEN 'in-progress'
WHEN NOT EXISTS (SELECT 1 FROM ProcessSteps WHERE ProcessID = @pid AND Status = 'finished') THEN 'queued'
ELSE 'finished'
END AS ProcessStatus
FROM ProcessSteps
WHERE ProcessID = @pid
The query first checks if any of the steps are in-progress
. If there is any, the status of in-progress
is returned. Next is checks if all the steps are finished, and if not returned queued
, otherwise it returns finished
.