Вы должны включить CORS. В зависимости от приложения, есть разные способы сделать это, я обычно делаю это на сервере.
Подробнее здесь: https://enable-cors.org/
Используя ROW_NUMBER()
, PIVOT
и некоторый динамический SQL (но никакой необходимый курсор):
CREATE TABLE [dbo].[stackoverflow_198716](
[code] [varchar](1) NOT NULL,
[number] [int] NOT NULL
) ON [PRIMARY]
DECLARE @sql AS varchar(max)
DECLARE @pivot_list AS varchar(max) -- Leave NULL for COALESCE technique
DECLARE @select_list AS varchar(max) -- Leave NULL for COALESCE technique
SELECT @pivot_list = COALESCE(@pivot_list + ', ', '') + '[' + CONVERT(varchar, PIVOT_CODE) + ']'
,@select_list = COALESCE(@select_list + ', ', '') + '[' + CONVERT(varchar, PIVOT_CODE) + '] AS [col_' + CONVERT(varchar, PIVOT_CODE) + ']'
FROM (
SELECT DISTINCT PIVOT_CODE
FROM (
SELECT code, number, ROW_NUMBER() OVER (PARTITION BY code ORDER BY number) AS PIVOT_CODE
FROM stackoverflow_198716
) AS rows
) AS PIVOT_CODES
SET @sql = '
;WITH p AS (
SELECT code, number, ROW_NUMBER() OVER (PARTITION BY code ORDER BY number) AS PIVOT_CODE
FROM stackoverflow_198716
)
SELECT code, ' + @select_list + '
FROM p
PIVOT (
MIN(number)
FOR PIVOT_CODE IN (
' + @pivot_list + '
)
) AS pvt
'
PRINT @sql
EXEC (@sql)
Просто, потому что я хотел получить еще некоторый опыт с CTEs, я придумал следующее:
WITH CTE(CTEstring, CTEids, CTElast_id)
AS
(
SELECT string, CAST(id AS VARCHAR(1000)), id
FROM dbo.Test_Pivot TP1
WHERE NOT EXISTS (SELECT * FROM dbo.Test_Pivot TP2 WHERE TP2.string = TP1.string AND TP2.id < TP1.id)
UNION ALL
SELECT CTEstring, CAST(CTEids + ' ' + CAST(TP.id AS VARCHAR) AS VARCHAR(1000)), TP.id
FROM dbo.Test_Pivot TP
INNER JOIN CTE ON
CTE.CTEstring = TP.string
WHERE
TP.id > CTE.CTElast_id AND
NOT EXISTS (SELECT * FROM dbo.Test_Pivot WHERE string = CTE.CTEstring AND id > CTE.CTElast_id AND id < TP.id)
)
SELECT
t1.CTEstring, t1.CTEids
FROM CTE t1
INNER JOIN (SELECT CTEstring, MAX(LEN(CTEids)) AS max_len_ids FROM CTE GROUP BY CTEstring) SQ ON SQ.CTEstring = t1.CTEstring AND SQ.max_len_ids = LEN(t1.CTEids)
ORDER BY CTEstring
GO
Возможно, требовалась бы некоторую тонкую настройку, но это работало с Вашим примером
Объединить функция могла также использоваться здесь, подобная другим вопросам, которые спросили о конкатенирующих данных.
Этот связанный вопрос должен иметь ответ, в котором Вы нуждаетесь: SQL Server: Примеры ВЕРТЯЩИХСЯ Строковых данных
Матричное управление в SSRS имеет динамические столбцы, если эти данные направляются в отчет так или иначе затем, Вы могли бы использовать это. Иначе необходимо будет создать sql sproc, который генерирует sql как в примерах динамично и затем выполняет его.
Я не уверен, что то, что Вы делаете, действительно возможно (или по крайней мере практично) в SQL - я не уверен, потому что я все еще не абсолютно уверен, что Вы хотите сделать.
Вы могли создать ту сводную таблицу в своем клиентском приложении, например, с:
select distinct Letter from MyTable
получить список букв и затем использовать параметризированный запрос в цикле:
select Number from MyTable where Letter=:letter
получить список чисел для каждой буквы.