Отключение с заголовками столбцов - одна строка - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть некоторая информация о конкретном человеке, которую я хочу показать в двух строках, а не в нескольких столбцах.

Я бы хотел, чтобы столбцы были "ColumnName" и "ColumnData"

Это мой запрос на возврат одной строки:

SELECT C.CUSTOMER_NAME
      ,CC.CONTACT_NAME
      ,CC.TELEPHONE
      ,CC.FAX
      ,CC.CONTACT_INITIALS
      ,CC.CONTACT_FIRSTNAME
      ,CC.EMAIL
      ,CC.CONTACT_DEAR
      ,CC.NUMERIC_PHONE_NO
      ,CC.TELEPHONE_NUMBER2
      ,CC.MOBILE_TELEPHONE
      ,CC.NUMERIC_TELEPHONE2
      ,CC.NUMERIC_MOBILE
      ,CC.NUMERIC_FAX
      ,CC.CONTACT_FULL_NAME
      ,CONTACT_MIDDLE_NAMES
FROM table C 
INNER JOIN table CC
ON C.column = CC.column
WHERE C.column = @CustomerAccount

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

Хотя я могу получить имена столбцов из sys.columns, я не могу связать их с таблицей, а также должен был бы отключить их.

Есть ли способ превратить эту единственную строку вдва столбца, состоящие из имени столбца и данных в этом столбце?

Буду благодарен за любые подсказки, ссылки или рекомендации.

Спасибо

Будет.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Вот методика, которая "динамически" отключает практически любую таблицу, представление или специальный запрос без фактического использования динамического SQL

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

Пример

Select C.*
 From  ( Your table or Query Here ) A
 Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
 Cross Apply (
               Select Item  = xAttr.value('local-name(.)', 'varchar(100)')
                     ,Value = xAttr.value('.','varchar(max)')
                From  XMLData.nodes('//@*') xNode(xAttr)
                Where xAttr.value('local-name(.)','varchar(100)') not in ('Columns','ToExclude')
             ) C

Следует отметить, что WHERE необязательно.

0 голосов
/ 18 февраля 2019

Вы можете использовать UNPIVOT, как в следующем запросе.

;WITH cte 
     AS (SELECT C.customer_name, 
                CC.contact_name, 
                CC.telephone, 
                CC.fax, 
                CC.contact_initials, 
                CC.contact_firstname, 
                CC.email, 
                CC.contact_dear, 
                CC.numeric_phone_no, 
                CC.telephone_number2, 
                CC.mobile_telephone, 
                CC.numeric_telephone2, 
                CC.numeric_mobile, 
                CC.numeric_fax, 
                CC.contact_full_name, 
                contact_middle_names 
         FROM   table C 
                INNER JOIN table CC 
                        ON C.COLUMN = CC.COLUMN 
         WHERE  C.COLUMN = @CustomerAccount) 
SELECT u.x AS ColumnName, 
       u.y AS ColumnValue 
FROM   cte s 
       UNPIVOT ( [y] 
               FOR [x] IN (customer_name, 
                           contact_name, 
                           telephone, 
                           fax, 
                           contact_initials, 
                           contact_firstname, 
                           email, 
                           contact_dear, 
                           numeric_phone_no, 
                           telephone_number2, 
                           numeric_mobile, 
                           numeric_fax, 
                           contact_full_name, 
                           contact_middle_names) ) u; 

Online Demo

...