Member 12770648 Ответов: 1

Как выбрать поля из инструкции @SQL для UNPIVOT


Нужно выбрать поля из @sql buildup, чтобы использовать оператор UNPIVOT команда


SET @sql = ' SELECT A.BRN_NAME ,A.PROD_SERV , A.COMP_TYPE,
				  P.PROD_SERV_TAT, 
				  COUNT(*) AS OVER_CNT FROM TRIAL
  LEFT JOIN BRANCH C ON A.BRN_NAME = C.BRN_NAME
  LEFT JOIN PROD_SERV P ON A.PROD_SERV = P.PROD_SERV_NAME
  LEFT JOIN PAYMAST B ON A.LNAME = B.LNAME
  AND A.FNAME = B.FNAME '






SET @sql = 'SELECT BRN_NAME, PROD_SERV, COMP_TYPE, 
              PROD_SERV_TAT,OVER_CNT,OPINIONS,OPINION_CNT 
             from ('+  @sql+') AA

   UNPIVOT
     (
      OPINIONS_CNT FOR [OPINIONS] IN ([ACCEPT_TAT], [BEYOND_TAT] , [EXACT_TAT]) 
     ) AB  '



---------------------------------------------------------------------------------

Вот что я пытался сделать

SET @sql = 'SELECT BRN_NAME, PROD_SERV, COMP_TYPE, 
              PROD_SERV_TAT,OVER_CNT,OPINIONS,OPINION_CNT 
             from ('+  @sql+') AA


Любая помощь в преодолении этой проблемы

Спасибо

Что я уже пробовал:

Проверил сеть и другие работы все безрезультатно

1 Ответов

Рейтинг:
2

Wendelius

Из-за гибкой природы языка SQL было бы трудно анализировать имена столбцов только из строки. Вам нужно будет принять во внимание такие вещи, как
- Псевдоним таблицы
- Псевдоним столбца
- Использование функций
- Скалярные запросы
- и так далее...

Несколько вещей, которые могут сработать для вас:

Сохраните список столбцов или имена столбцов в отдельной строке и используйте их в обоих местах.

определите имя столбца с помощью некоторого специального шаблона символов. Используйте этот шаблон для поиска столбцов, например

SELECT A.##BRN_NAME##, 
       A.##PROD_SERV##, 
       A.##COMP_TYPE##,
       P.##PROD_SERV_TAT##,
       COUNT(*) AS ##OVER_CNT##
FROM TRIAL

Теперь вы можете найти имена между ними ## Просто не забудьте удалить хэши перед использованием оператора.

ДОПОЛНЕНИЕ:
---------
При извлечении имен столбцов и использовании их в других местах, в зависимости от ожидаемых инструкций SQL, необходимо учитывать множество факторов. Как уже было сказано, SQL является гибким в письменной форме.

Но для начала рассмотрим следующий пример
CREATE TABLE #test2 (
  col1 int,
  col2 int
);

INSERT INTO #test2 VALUES 
(1,2),
(3,4);

Теперь, если мы создадим функцию, которая будет извлекать список столбцов из простого случая, это может выглядеть примерно так
CREATE FUNCTION ColList(@originalSql nvarchar(max)) RETURNS varchar(max) AS 
BEGIN
   DECLARE @list nvarchar(max),
           @index1 int,
		   @index2 int;

   SET @index1 = 0;
   SET @list = '';
   SET @index1 =CHARINDEX('##', @originalSql, 0) + 2;
   WHILE @index1 > 0 BEGIN
      SET @index2 =CHARINDEX('##', @originalSql, @index1 + 2);
      IF (@list != '') BEGIN
	     SET @list = @list + ', ';
	  END;
      SET @list = @list + SUBSTRING(@originalSql, @index1, @index2 - @index1);
      SET @index1 = CHARINDEX('##', @originalSql, @index2 + 2) ;
	  IF (@index1 > 0 ) BEGIN
	     SET @index1 = @index1 + 2
	  END;
   END;

   RETURN @list
END;

Давайте проведем тест
DECLARE
  @sql nvarchar(max),
  @col nvarchar(max)
BEGIN
   SET @sql = 'SELECT t.##Col1##, t.##Col2## FROM #Test2 t';

   SET @col = dbo.ColList(@sql);
   SET @sql = 'SELECT ' + @col + ' FROM (' + REPLACE(@sql, '##','') + ') a';
   PRINT  @sql;
   EXEC (@sql);
END;

Выполняемый запрос выглядит следующим образом
SELECT Col1, Col2 FROM (SELECT t.Col1, t.Col2 FROM #Test2 t) a

Но, как уже было сказано, это только начало. Например, вам может потребоваться определить псевдоним для столбцов, используемых в списке столбцов, и т. д...


Member 12770648

Спасибо за объяснение

используя приведенный вами пример, как это будет
Я выбираю это.

SET @sql = 'SELECT BRN_NAME, PROD_SERV, COMP_TYPE,
PROD_SERV_TAT,OVER_CNT,МНЕНИЯ,OPINION_CNT
from ('+ @sql+') AA


Спасибо снова

Wendelius

Смотрите обновленный ответ