Ссылка на инструкцию case вне таблицы Temp - PullRequest
1 голос
/ 21 февраля 2012
declare @Temp table 
(CaseID int,
PrimaryClientID int,
Category int
) 



INSERT INTO @Temp

SELECT 
      [casCaseID],
      [casPrimaryClientID],


    CASE
        WHEN (SELECT COUNT(evecaseid) FROM MPS3.dbo.Events where evecaseid=cascaseid and eveworkflowid=960)>0 THEN 1
        WHEN (SELECT COUNT(CTC2.ctcCaseID)FROM MPS3.dbo.ClientToCase CTC1 INNER JOIN MPS3.dbo.ClientToCase CTC2 ON CTC1.ctcClientID=CTC2.ctcClientID INNER JOIN MPS3.dbo.Events E2 ON CTC2.ctcCaseID=E2.eveCaseID AND E2.eveWorkflowID=960 WHERE CTC1.ctcCaseID=casCaseID AND CTC2.ctcCaseID < CTC1.ctcCaseID)>0 THEN 2
        ELSE 3
    END AS [FPCategory] 



FROM [MPS3].[dbo].[Cases]

  WHERE 

  casRecontactDate BETWEEN '2012-01-01' AND '2012-01-01'
  AND
  casCaseType = 'm'

ORDER BY FPCategory

SELECT
Category AS [CategoryType],
COUNT(Category) AS [CategoryTotal]

CASE

WHEN [Category] = 0 or [Category] = 0 THEN 0

else ([Category]+0.0)/COUNT[Category])

END AS [Percentage],


FROM
@Temp

GROUP BY 

Category

Чтобы упростить то, что я написал, я создал временную таблицу, в которой перечислены случаи в базе данных. Я применил оператор case, который затем разделяет эти случаи на 3 типа: 1,2 или 3.

В приведенном ниже утверждении select я хотел бы иметь еще один столбец, в котором показан процент каждой из этих категорий от общего числа. Моя проблема в том, что я не могу использовать псевдоним "FPCategory" из более раннего оператора case, так как он еще не произошел для допустимого имени столбца, которое будет использоваться в более позднем операторе.

Спасибо!

1 Ответ

0 голосов
/ 21 февраля 2012

Перво-наперво, давайте покончим с этими неприятными подзапросами и преобразуем ваш запрос в CTE (непроверенный, поскольку я не могу видеть вашу схему):

WITH    EventCounts ( casCaseID, EventCount )
          AS ( SELECT   evecaseid ,
                        COUNT(evecaseid)
               FROM     MPS3.dbo.Events
               WHERE    eveworkflowid = 960
             ),
        ClientToCaseCounts ( casCaseID, ClientToCaseCount )
          AS ( SELECT   CTC1.ctcCaseID ,
                        COUNT(CTC2.ctcCaseID)
               FROM     MPS3.dbo.ClientToCase CTC1
                        INNER JOIN MPS3.dbo.ClientToCase CTC2 ON CTC1.ctcClientID = CTC2.ctcClientID
                        INNER JOIN MPS3.dbo.Events E2 ON CTC2.ctcCaseID = E2.eveCaseID
                                                         AND E2.eveWorkflowID = 960
               WHERE    CTC2.ctcCaseID < CTC1.ctcCaseID
             ),
        BaseData ( [casCaseID], [casPrimaryClientID], [FPCategory] )
          AS ( SELECT   [casCaseID] ,
                        [casPrimaryClientID] ,
                        CASE WHEN EventCounts.EventCount > 0 THEN 1
                             WHEN ClientToCaseCounts.ClientToCaseCount > 0 THEN 2
                             ELSE 3
                        END AS [FPCategory]
               FROM     [MPS3].[dbo].[Cases] C
                        LEFT OUTER JOIN EventCounts ON C.[casCaseID] = EventCounts.casCaseID
                        LEFT OUTER JOIN ClientToCaseCounts ON C.[casCaseID] = ClientToCaseCounts.casCaseID
               WHERE    casRecontactDate BETWEEN '2012-01-01'
                                         AND     '2012-01-01'
                        AND casCaseType = 'm'
             )
    SELECT  [FPCategory] ,
            COUNT([casCaseID]) AS TotalCases
    FROM    BaseData
    GROUP BY [FPCategory] 

Теперь, я заметил вас, где группировка по FPCategory в вашем последнем запросе подразумевает, что ваши результаты будут иметь несколько casCaseID для каждой FPCategory? Я не уверен на 100%, что вы хотите усреднить? но теперь это CTE, вы можете присоединить EventCounts & ClientToCaseCounts к окончательному запросу (рекурсия). Надеюсь, что это направит вас в правильном направлении, если нет, предоставьте несколько примеров схем и примеров данных, и я соответствующим образом подправлю свой ответ.

...