2013-11-14 6 views
0

У меня есть 2 таблицы и хранимая процедура для отображения данных из них.Динамические заголовки столбцов в инструкции SELECT

Таблица 1 Результат который выглядит следующим образом:

ResultName ActivityDate  ID 

Result1  2013-11-14  1 
Result1  2013-11-14  2 
Result2  2013-11-14  3 
Result3  2013-11-14  4 

Таблица 2 является ResultDetail, который выглядит следующим образом:

ResultName ActivityDateType 

Result1  DateType1 
Result2  DateType1 
Result3  DateType2  

Когда я запускаю мою хранимую процедуру для выбора данных из их, у меня в настоящее время есть что-то вроде этого:

ResultName ActivityDateType ActivityDate ID 

Result1  DateType1   2013-11-14  1 
Result1  DateType1   2013-11-14  2 
Result2  DateType1   2013-11-14  3 
Result3  DateType2   2013-11-14  4 

Я хотел бы создать имя столбца ActivityDate в моих результатах выбора в ActivityDateType при выборе определенного ResultName.

Так, например, если я выбрал только Result1-х я хотел бы, чтобы это было:

ResultName DateType1 ID 

Result1  2013-11-14 1 
Result1  2013-11-14 2 

Я пытался поставить его в переменную, присоединяясь таблицы вместе, а затем с помощью Str() функция ActivityDate как ул (@ActivityDateType)

но это не работает (возможно, по понятным причинам, я не получаю)

кто-нибудь есть какие-нибудь идеи?

Большое спасибо

+0

Если «Результат1» имел два разных объекта ActivityDateType «DateType1» и «DatetYpe2», которые у вас были бы как столбик, так и правильные значения под ним, ri ght? –

+0

Таблица ResultDetail имеет 1 строку в ResultName, нет дубликатов, поэтому у них будет только 1 ActivityDateType – user2992750

+0

вам нужны динамические SQL и PIVOT. в случае, если вы хотите, чтобы результат был отфильтрован для множественного имени результата, опубликованный sol покрывает это. –

ответ

0

это готовит таблицы, как у вас есть.

SET NOCOUNT ON 
    IF OBJECT_ID('tempdb..#result') IS NOT NULL 
     DROP TABLE #result 
    CREATE TABLE #result 
    ( 
     resultname  sysname NOT NULL 
     ,ActivityDate DATE NOT NULL 
     ,id    INT NOT NULL 
    ) 
    IF OBJECT_ID('tempdb..#resultdetail') IS NOT NULL 
     DROP TABLE #resultdetail 
    CREATE TABLE #resultdetail 
    ( 
     resultname   sysname NOT NULL 
     ,ActivityDateType sysname NOT NULL 
    ) 

    INSERT INTO #result(resultname, ActivityDate, id) 
       SELECT 'Result1','11/14/2013',1 
    UNION ALL SELECT 'Result1','11/14/2013',2 
    UNION ALL SELECT 'Result2','11/14/2013',3 
    UNION ALL SELECT 'Result3','11/14/2013',4 

    INSERT INTO #resultdetail(resultname, ActivityDateType) 
       SELECT 'Result1','DateType1' 
    UNION ALL SELECT 'Result2','DateType1' 
    UNION ALL SELECT 'Result3','DateType2' 

    SET NOCOUNT OFF 

Это Окончательный запрос, который возвращает данные, как вы объяснили.

обратите внимание, что я решил вернуть результат для "Result1" и "Result3"

SET NOCOUNT ON 

    IF OBJECT_ID('tempdb..#DynamicColumn_Select') IS NOT NULL 
     DROP TABLE #DynamicColumn_Select 
    CREATE TABLE #DynamicColumn_Select 
    (
     ColumnName  sysname NOT NULL PRIMARY KEY 
    ) 

    /*Prepare the user input for which ResultName we need to generate Final Results*/ 
    INSERT INTO #DynamicColumn_Select(ColumnName) 
    SELECT 'Result1' UNION ALL SELECT 'Result3' 

    DECLARE @CsvDynamicColumn_Select NVARCHAR(MAX)='' 
      ,@CsvDynamicColumn_PvtIn NVARCHAR(MAX)='' 
      ,@SQL NVARCHAR(MAX)='' 

    /*Prepare the Dynamic PIVOT IN Column List as CSV*/ 
    SELECT @CsvDynamicColumn_PvtIn = 
      CASE WHEN @CsvDynamicColumn_PvtIn = '' 
       THEN '' 
       ELSE @CsvDynamicColumn_PvtIn + ',' 
      END 
      + N'['+ActivityDateType+N']' 
    FROM 
    (
     Select DISTINCT t1.ActivityDateType 
     FROM #resultdetail t1 
     WHERE resultname IN 
      (SELECT ColumnName FROM #DynamicColumn_Select) 
    )qry 


    /*Prepare the Dynamic Select Column list as CSV*/ 
    SELECT @CsvDynamicColumn_Select = 
      CASE WHEN @CsvDynamicColumn_Select = '' 
       THEN '' 
       ELSE @CsvDynamicColumn_Select + ',' 
      END 
      + ActivityDateType 
    FROM 
    (
     Select DISTINCT t1.ActivityDateType 
     FROM #resultdetail t1 
     WHERE resultname IN 
      (SELECT ColumnName FROM #DynamicColumn_Select) 
    )qry 

    PRINT @CsvDynamicColumn_PvtIn 
    PRINT @CsvDynamicColumn_Select 


    SET @SQL = N' 
     SELECT resultname,id, '+ @CsvDynamicColumn_Select 
     +N' 
     FROM 
     (
      SELECT resultname,id, '[email protected]_Select 
      +N' 
      FROM 
      (
       SELECT t1.resultname,t2.ActivityDateType,t1.ActivityDate,t1.id 
       FROM #result t1 
       JOIN #resultdetail t2 
        ON t1.resultname=t2.resultname 
       Where t1.resultname in (Select ColumnName From #DynamicColumn_Select) 
      )q1 
      PIVOT 
      (MAX(ActivityDate) FOR ActivityDateType IN ('[email protected]_PvtIn+N'))pvt 
     )qry 
    ' 
    PRINT @SQL 
    EXECUTE sp_executesql @SQL 

    SET NOCOUNT OFF 

Это Результат выше запроса

enter image description here

Смежные вопросы