У меня есть следующая таблица, используемая в динамической сводке для PORT_NAME:
DECLARE @BaseQuery TABLE
(
PORT_NAME NVARCHAR(50),
BILL_ACCOUNT_NAME NVARCHAR(50),
AVERAGE float
);
Мне нужно сохранить вывод в виде таблицы, я попытался добавить следующий код, поскольку столбцы должны быть динамическими для планирования задания SQL:
DECLARE @sql varchar(max)
SET @sql = 'CREATE TABLE ##T1 (BILL_ACCOUNT_NAME NVARCHAR(50),' + @Columns + ' float)'
EXEC(@sql)
INSERT INTO ##T1 VALUES (select @Query)
SELECT * FROM ##T1
got (Неправильный синтаксис рядом с ключевым словом «выбрать».)
Я работаю в SQL Server Management Studio 18 (версия 2019 г.), я пытался прочитать код в SSIS, но не смог прочитать результаты.
«Мне нужно, чтобы все сводные столбцы были числами с плавающей запятой, а BILL_ACCOUNT_NAME — NVARCHAR(50)». С таким названием, как BILL_ACCOUNT_NAME
(и другим столбцом с именем TOTAL_PRE_VAT_AMNT_PER_INVOICE
), это звучит так, как будто данные — это финансовые данные. Если да, то float
— это ужасный выбор типа данных для ваших денежных значений. Значения базы 2 не подходят для хранения финансовых значений базы 10.
Почему бы просто не использовать into <resultstable> from...
в последнем запросе?
«это запросы от моих старших». Тогда ваши старшие должны знать, насколько ошибочным является требование хранить финансовые данные в float
; используйте decimal
(вероятно, decimal(18,4)
или аналогичный).
Stu Я пробовал, не получилось, может я не так сделал, не могли бы вы уточнить?
Вы можете вставить результат сводки в новый объект таблицы, используя INTO
.
Выполняет строку @Query
, которая создает объект dbo.RESULT_PIVOT_TABLE
.
SET @Query = 'SELECT
BILL_ACCOUNT_NAME,
' + @Columns + N'
INTO dbo.RESULT_PIVOT_TABLE -- INSERT PIVOT RESULT INTO TABLE OBJECT
FROM (SELECT
PORT_NAME,
BILL_ACCOUNT_NAME,
AVERAGE
FROM #BaseQuery) AS a PIVOT (MAX(AVERAGE) FOR a.PORT_NAME IN (' + @Columns + ')) AS P';
EXEC sp_executesql @Query;
SELECT * FROM dbo.RESULT_PIVOT_TABLE;
DROP TABLE IF EXISTS dbo.RESULT_PIVOT_TABLE;
DROP TABLE IF EXISTS #BaseQuery;
CREATE TABLE #BaseQuery
(
PORT_NAME NVARCHAR(50),
BILL_ACCOUNT_NAME NVARCHAR(50),
AVERAGE FLOAT
);
DECLARE @Query NVARCHAR(MAX);
DECLARE @Columns NVARCHAR(MAX);
/* POPULATE TEMP DUMMY TABLE WITH FAKE DATA */
INSERT INTO #BaseQuery
SELECT
a.PORT_NAME,
a.BILL_ACCOUNT_NAME,
a.AVERAGE
FROM (SELECT
'PORT 1' AS PORT_NAME,
'NAME 1' AS BILL_ACCOUNT_NAME,
1.23 AS AVERAGE
UNION ALL
SELECT
'PORT 2' AS PORT_NAME,
'NAME 2' AS BILL_ACCOUNT_NAME,
2.34 AS AVERAGE
UNION ALL
SELECT
'PORT 3' AS PORT_NAME,
'NAME 3' AS BILL_ACCOUNT_NAME,
3.45 AS AVERAGE) a;
/* SET COLUMNS FOR PIVOT */
SELECT
@Columns = STRING_AGG(a.PORT_NAME, ',')
FROM (SELECT DISTINCT
QUOTENAME(PORT_NAME) AS PORT_NAME
FROM #BaseQuery) a;
/* SET DYNAMIC QUERY STRING THAT INSERTS PIVOT RESULT INTO TABLE OBJECT */
SET @Query = 'SELECT
BILL_ACCOUNT_NAME,
' + @Columns + N'
INTO dbo.RESULT_PIVOT_TABLE -- INSERT PIVOT RESULT INTO TABLE OBJECT
FROM (SELECT
PORT_NAME,
BILL_ACCOUNT_NAME,
AVERAGE
FROM #BaseQuery) AS a PIVOT (MAX(AVERAGE) FOR a.PORT_NAME IN (' + @Columns + ')) AS P';
EXEC sp_executesql @Query;
SELECT * FROM dbo.RESULT_PIVOT_TABLE;
Вы спасатель жизни. большое спасибо, я очень ценю время, которое вы потратили, чтобы ответить на мой вопрос.
Зачем тогда нужно хранить данные в таблице? Что вы потом собираетесь делать с этими данными? Звучит как проблема XY, если честно. Подобный поворот обычно должен выполняться на уровне представления.