2010-03-30 5 views
1

У меня есть таблица проекта со следующими столбцамикрест вкладка запроса

ProjectID, ProjectDescription 

и таблицы со списком данных, который имеет следующие столбцы

ProjectID ListType Date Memo 

Каждый проект имеет много записей типа списка в ListType таблице ,

То, что я хочу сделать, это запустить запрос, который будет возвращать что-то вроде этого

ProjectID, ProjectDescription, ListType1, ListType1.date, Listtype1.Memo, ListType2, ListType2.date, ListType.Memo 

Againg, Каждый проект coonected к ряду данных типа списка. Я использую Microsoft SQL 2000. поэтому ключевое слово Pivot не работает

ответ

0

Что вам нужно сделать, так это создать динамический SQL и создать дополнительные операторы CASE для каждого типа ListType. Мне нужно было сделать что-то подобное для работы, где они хотят получить определенную информацию о событиях. События будут переданы как список, разделенный запятыми, а затем я создам аргументы case.

У меня есть хранимая процедура, которая создает таблицу из разделенных запятыми список

CREATE PROCEDURE [dbo].[ListToTable] 
    @vcList  VARCHAR(8000), 
    @vcDelimiter VARCHAR(8000), 
    @TableName  SYSNAME, 
    @ColumnName SYSNAME 
AS 
    SET NOCOUNT ON 

    DECLARE @iPosStart INT, 
     @iPosEnd INT, 
     @iLenDelim INT, 
     @iExit  INT, 
     @vcStr  varchar(8000), 
     @vcSql  varchar(8000) 

    SET @iPosStart = 1 
    SET @iPosEnd = 1 
    SET @iLenDelim = LEN(@vcDelimiter) 

    SET @vcSql = 'INSERT ' + @TableName + ' (' + @ColumnName + ') VALUES (''' 

    SET @iExit = 0 

    WHILE @iExit = 0 
    BEGIN 
     SET @iPosEnd = CHARINDEX(@vcDelimiter, @vcList, @iPosStart) 

     IF @iPosEnd <= 0 
     BEGIN 
      SET @iPosEnd = LEN(@vcList) + 1 
      SET @iExit = 1 
     END 

     SET @vcStr = SUBSTRING(@vcList, @iPosStart, @iPosEnd - @iPosStart) 

     EXEC(@vcSql + @vcStr + ''')') 

     SET @iPosStart = @iPosEnd + @iLenDelim 
    END 

    RETURN 0 

Тогда вот динамический SQL

DECLARE @Events VARCHAR(8000) = 'Event1,Event2,... Eventn' 

CREATE TABLE #Events 
    (
    EventName VARCHAR(MAX) 
    ) 

EXEC [ListToTable] 
    @Events 
    ,',' 
    ,'#Events' 
    ,'EventName' 

DECLARE @strCASE VARCHAR(MAX) 
SET @strCase = '' 

DECLARE Events_Cursor CURSOR 
FOR 
SELECT EventName FROM [#Events] 

OPEN Events_Cursor 
DECLARE @EventName VARCHAR(MAX) 

FETCH NEXT FROM Events_Cursor INTO @EventName 
WHILE (@@FETCH_STATUS <> -1) 
    BEGIN 
     IF (@@FETCH_STATUS <> -2) 
      SET @strCase = @strCase + ',CASE WHEN [EventOpportunityProduct].[Name] = ''' + @EventName + ''' THEN EventOppertunityLineItem.[Trial_Status__c] ELSE NULL END [' + @EventName + ']' 
     FETCH NEXT FROM Events_Cursor INTO @EventName 
    END 
CLOSE Events_Cursor 
DEALLOCATE Events_Cursor 

Затем добавьте @strCASE в свой ЗЕЬЕСТ напр.

DECLARE @strSQL VARCHAR(MAX) 
SET @strSQL = 'SELECT 
    Field1 
    ,Field2 
    ' + @strCASE + ' 
    FROM Table' 

EXEC (@strSQL) 
Смежные вопросы