I’ve a result set from a query like this below
Court_id | from | to | Available |
---|---|---|---|
7 | 6:00:00 | 7:00:00 | Yes |
7 | 7:00:00 | 8:00:00 | No |
7 | 8:00:00 | 9:00:00 | Yes |
8 | 6:00:00 | 7:00:00 | Yes |
8 | 7:00:00 | 8:00:00 | Yes |
8 | 8:00:00 | 9:00:00 | No |
9 | 6:00:00 | 7:00:00 | Yes |
9 | 7:00:00 | 8:00:00 | Yes |
9 | 8:00:00 | 9:00:00 | No |
How can I achieve in column wise like below from the above result ?
from | to | 7 | 8 | 9 |
---|---|---|---|---|
6:00:00 | 7:00:00 | Yes | Yes | Yes |
7:00:00 | 8:00:00 | no | Yes | Yes |
8:00:00 | 9:00:00 | Yes | no | no |
Court_id can change time to time.
I’ve tried the following
x
CREATE TABLE [testslots](
[Court_id] [int] NULL,
[from] [nvarchar](10) NULL,
[to] [nvarchar](10) NULL,
[Available] [nvarchar](10) NULL);
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (7,'6AM','7AM','Yes');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (7,'7AM','8AM','no');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (7,'8AM','9AM','Yes');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (8,'6AM','7AM','Yes');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (8,'7AM','8AM','Yes');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (8,'8AM','9AM','no');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (9,'6AM','7AM','Yes');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (9,'7AM','8AM','Yes');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (9,'8AM','9AM','no');
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.Court_id)
FROM [testslots] c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT [from],[to], ' + @cols + ' from
(
select [from]
, [to]
, [available]
from testslots
) x
pivot
(
max([available])
for available in (' + @cols + ')
) p '
exec sp_executesql @query;
Advertisement
Answer
You are pivoting the wrong columns:
DECLARE @cols nvarchar(max) = STUFF((
SELECT distinct ',' + QUOTENAME(c.Court_id)
FROM [testslots] c
FOR XML PATH(''), TYPE
).value('text()[1]', 'NVARCHAR(MAX)')
,1,LEN(','),'');
DECLARE @query nvarchar(max) = '
SELECT
[from],[to],
' + @cols + '
from
(
select [from]
, [to]
, Court_id
, available
from testslots
) x
pivot
(
max([available])
for Court_id in (' + @cols + ')
) p;
';
exec sp_executesql @query;