Coldfusion: нужна помощь с выводом запроса по одной строке на систему вместо нескольких строк - PullRequest
0 голосов
/ 22 сентября 2011

ИСТОРИЯ: Система прошла через 1 - 19 или около того статусов, прежде чем перейти к производству. Мне нужно создать отчет, показывающий дату, когда система прошла через статус, и NA, если система не прошла через статус.

ТРЕБОВАНИЯ: отчет должен выглядеть примерно так:

System      Initial     Operations  PIM_Assigned    PIM_Complete    Database    Application 
Server001   9/1/2011    NA          9/2/2011        NA              NA          9/1/2011
Server002   9/10/2011   NA          9/5/2011        9/25/2011       NA          9/9/2011
Server003   9/21/2011   9/22/2011   NA              NA              9/24/2011   NA
Server004   9/23/2011   9/19/2011   9/23/2011       9/20/2011       9/23/2011   9/1/2011

Вот запрос с примером дампа данных ниже (дамп не совпадает выше - выше для иллюстрации):

select status, convert(varchar,effectivedate,101) e, systemname  
from si_statushistory
where systemname='SERVER052'  
order by e desc, history_id desc

с выводом из моего запроса выглядит так:

PSI            09/09/2011   SERVER052  
Application    09/09/2011   SERVER052  
Operations     09/09/2011   SERVER052  
Application    07/14/2011   SERVER052  
Operations     07/13/2011   SERVER052  
Operations     07/13/2011   SERVER052  
PSI            07/13/2011   SERVER052  
PIM Assigned   06/08/2011   SERVER052  
PSI            06/08/2011   SERVER052  
SD_Verify      01/15/2012   SERVER052  
PSI Operations 01/08/2012   SERVER052  
Frame Team     01/01/2011   SERVER052

Пример того, как будет выглядеть ОДНА строка:

something is missing here

Надеюсь, это понятно и имеет смысл ...

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

1 Ответ

0 голосов
/ 22 сентября 2011
CREATE PROCEDURE dbo.ReturnPivotedSystemInfo
AS
BEGIN
    SET NOCOUNT ON;

    ;WITH x AS
    (
        SELECT 
            [system] = systemname, 
            [status], 
            ed = CONVERT(CHAR(10), effectivedate, 101), -- not varchar w/o length
            rn = ROW_NUMBER() OVER 
                (PARTITION BY systemname, status ORDER BY effectivedate DESC)
        FROM dbo.si_statushistory
        -- where clause here
    )
    SELECT [system], 
        Initial      = COALESCE(MAX(CASE WHEN [status] = 'Initial'      THEN ed END), 'NA'),
        Operations   = COALESCE(MAX(CASE WHEN [status] = 'Operations'   THEN ed END), 'NA'),
        PIM_Assigned = COALESCE(MAX(CASE WHEN [status] = 'PIM Assigned' THEN ed END), 'NA')
        --, repeat for other possible values of status
    FROM x
    WHERE rn = 1
    GROUP BY [system];
END
GO

Теперь вашему ColdFusion просто нужно выполнить хранимую процедуру dbo.ReturnPivotedSystemInfo, и с этого момента он должен вести себя так же, как если бы вы вызвали SELECT * FROM sometable ...

...