перекрестный запрос - PullRequest
       9

перекрестный запрос

1 голос
/ 30 марта 2010

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

ProjectID, ProjectDescription

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

ProjectID ListType Date Memo

В каждом проекте есть много записей типа списка в таблице ListType.

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

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

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

1 Ответ

0 голосов
/ 30 марта 2010

Что вам нужно будет сделать, это создать динамический 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 в оператор SELECT для примера.

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

EXEC (@strSQL)
...