SQL — Добавление сводки результатов

#sql #sql-server #database

#sql #sql-сервер #База данных

Вопрос:

У меня есть скрипт, который возвращает результаты на основе одного или нескольких условий. Существует около 20 столбцов, в которых может быть результат. Есть ли способ добавить сводный столбец в конце, чтобы указать, какие столбцы имеют значение для каждой записи?

Редактировать: SQL Server 2008 R2

Комментарии:

1. можете ли вы добавить, какую версию SQL Server вы используете?. Также, пожалуйста, опубликуйте пример результата, который вы хотите

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

Ответ №1:

Это всего лишь предположение, но вот один из подходов, который будет использовать немного XML для решения этой проблемы

Пример

 Declare @YourTable Table (ID int,Col1 varchar(50),Col2 varchar(50),Col3 varchar(50))
Insert Into @YourTable Values 
 (1,'HasValue',null,null)
,(2,'HasValue',null,'ValueHere')


Select A.*
      ,C.*
 From  @YourTable A
 Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
 Cross Apply (
               Select Columns = Stuff((Select ','  Item 
                From  (
                        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 ('ID','OtherColumns','ToExclude')
                       )C1
                For XML Path ('')),1,1,'') 
             ) C
  

ВОЗВРАТ

 ID  Col1        Col2    Col3        Columns
1   HasValue    NULL    NULL        Col1
2   HasValue    NULL    ValueHere   Col1,Col3
  

Ответ №2:

Решение не такое удобное, как у Джона, но здесь представлена версия «грубой силы», которая будет работать на более старой версии SQL Server.

 DECLARE @t TABLE (
    Col1 BIT,
    Col2 BIT,
    Col3 BIT
)

INSERT INTO @t SELECT 1,NULL,NULL
INSERT INTO @t SELECT NULL,1,NULL
INSERT INTO @t SELECT NULL,NULL,1

SELECT
    *
    ,    CASE WHEN Col1 IS NOT NULL THEN 'Col1: '   CONVERT(VARCHAR(20),Col1) ELSE '' END
         CASE WHEN Col2 IS NOT NULL THEN 'Col2: '   CONVERT(VARCHAR(20),Col2) ELSE '' END
         CASE WHEN Col3 IS NOT NULL THEN 'Col3: '   CONVERT(VARCHAR(20),Col3) ELSE '' END
    AS [Summary]
FROM @t