У меня есть таблица сИстория вызовов В колонках SQL SERVER
select [Caller ID] , [Call details] from [DEMO].[dbo].[calldetails]
хотите результаты в нескольких столбцах, как
У меня есть таблица сИстория вызовов В колонках SQL SERVER
select [Caller ID] , [Call details] from [DEMO].[dbo].[calldetails]
хотите результаты в нескольких столбцах, как
Вы можете использовать оператор PIVOT
таблицы, чтобы сделать это:
SELECT
[Caller ID],
[1] AS [Call Details 1],
[2] AS [Call Details 2],
[3] AS [Call Details 3]
FROM
(
SELECT
[Caller ID],
[Call details],
ROW_NUMBER() OVER(PARTITION BY [Caller ID]
ORDER BY [Caller ID]) AS RN
FROM [calldetails]
) AS t
PIVOT
(
MAX([Call details])
FOR RN IN([1], [2], [3])
) AS p;
Обратите внимание, что:
Caller ID
к группе деталей вызова в 3 колонки.Я приказал результаты Caller ID
, поскольку я должен использовать ORDER BY
с PARTITION BY
. Вот почему вы найдете результаты не в том же порядке, который вы ищете.
Это даст вам:
| Caller ID | Call Details 1 | Call Details 2 | Call Details 3 |
|-----------|-----------------|-----------------|----------------|
| 123 | Ordered Product | Shipped Product | More Details |
| 125 | product search | (null) | (null) |
| 234 | product search | Ordered Product | (null) |
Если вы хотите сделать это динамически и не перечислить этот список номера строки вручную, вы должны сделать это динамически следующим образом:
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @colnames AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
SELECT @cols = STUFF((SELECT distinct ',' +
QUOTENAME(RN)
FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY [Caller ID]
ORDER BY [Caller ID]) AS RN
FROM [Calldetails]
) AS t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
SELECT @colnames = STUFF((SELECT distinct ',' +
QUOTENAME(RN) + 'AS' +
QUOTENAME('[Call details ' + CAST(RN AS NVARCHAR(5)) + ']')
FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY [Caller ID]
ORDER BY [Caller ID]) AS RN
FROM [Calldetails]
) AS t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
SELECT @query = 'SELECT [Caller ID], ' + @colnames +
' FROM
(
SELECT
[Caller ID] ,
[Call details],
ROW_NUMBER() OVER(PARTITION BY [Caller ID]
ORDER BY [Caller ID]) AS RN
FROM [calldetails]
) AS t
PIVOT
(
MAX([Call details])
FOR RN IN(' + @cols + ')' +
') p';
execute(@query);
Большое спасибо .. :) –
@SaileshAgarwal - Добро пожаловать, пожалуйста, попробуйте принять ответьте, если вы сочтете это полезным. –
пожалуйста, проверьте ссылку на изображение, чтобы понять мое требование –
Простой, как ** ОСИ ** – lad2025