Можно ли использовать оператор if в операторе select / group by? Или другое решение? - PullRequest
0 голосов
/ 22 марта 2011

Использование SQLServer 2008

В настоящее время у меня есть функция, которая реализует функциональность, как показано ниже (хотя в функции есть переменные, которые я только что заполнил здесь, чтобы дать лучшее представление о том, чтовходные данные могут быть как).

Мне было интересно, есть ли способ, когда вы определяете @id как ноль (в настоящее время используется в Coalesce на v.ID), чтобы соответствовать всем, как если бы вы не имелиопределил его в выражениях select / group by?

        SELECT
            'ALL' as GeogType,
            CAST(v.AdmissionOn as date) as dtAdmission,
            (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) as timeInterval,
            CAST((DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1) as nvarchar) + ':00' as fromTime,
            CAST((DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1) + (24/1) as nvarchar) + ':00' as toTime,    
            v.ID,
            COUNT(*) as nVisits
        FROM dbo.Table1 v INNER JOIN dbo.Table2 t ON v.FSLDU = t.FSLDU5
        WHERE v.AdmissionOn >= '01-01-2010' AND v.AdmissionOn < DATEADD(day,1,'02-01-2010') 
              AND v.ID = Coalesce(@id,ID)
        GROUP BY    
            CAST(v.AdmissionOn as date),
            (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1),
            (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1),
            (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1) + (24/1),
            v.ID    
        ORDER BY 2,3,4

Он вернет набор результатов, аналогичный этому, когда @id равен нулю:

ALL 2010-01-01  0   0:00    24:00   7   4
ALL 2010-01-01  0   0:00    24:00   4   54
ALL 2010-01-01  0   0:00    24:00   0   2303
ALL 2010-01-01  0   0:00    24:00   3   412
ALL 2010-01-01  0   0:00    24:00   6   57
ALL 2010-01-01  0   0:00    24:00   2   64
ALL 2010-01-01  0   0:00    24:00   5   5
ALL 2010-01-01  0   0:00    24:00   1   103

Но я бы хотелвместо этого:

ALL 2010-01-01  0   0:00    24:00   ?   3002

Я не уверен, что будет в?колонка, возможно, что-то вроде 1,2,3,4,5,6,7?

Возможно ли это вообще чем-то, например, случаем в предложении select / group by или хранимой процедурой, о которой я не знаю?Если нет, я могу просто создать новую функцию, но я надеялся, что будет способ сделать это, просто введя @id как ноль.

Ответы [ 2 ]

2 голосов
/ 22 марта 2011

Изменить группу по на:

  GROUP BY CAST(v.AdmissionOn as date), 
     (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1), 
     (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1),
     (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1) + (24/1),  
     Case @Id When Null Then 0 Else Id End

Я отредактировал это, но само по себе работать не будет:

  GROUP BY CAST(v.AdmissionOn as date), 
     (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1), 
     (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1),
     (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1) + (24/1),  
     @Id

- Любой из них сам по себе вызовет ошибку, поскольку Id в операторе выбора отсутствует в Группе по. Любой из них может быть исправлен путем согласования выбора с группой.

    SELECT 'ALL' as GeogType, CAST(v.AdmissionOn as date) as dtAdmission,
         (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) as timeInterval,  
         CAST((DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * 
              (24/1) as nvarchar) + ':00' as fromTime, 
         CAST((DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * 
              (24/1) + (24/1) as nvarchar) + ':00' as toTime, 
         Case @Id When Null Then 0 Else Id End Id,
         COUNT(*) as nVisits
    FROM dbo.Table1 v 
        JOIN dbo.Table2 t 
          ON v.FSLDU = t.FSLDU5
    WHERE v.AdmissionOn >= '01-01-2010' 
       AND v.AdmissionOn < DATEADD(day,1,'02-01-2010') 
       AND v.ID = Coalesce(@id,ID)      
    GROUP BY CAST(v.AdmissionOn as date), 
     (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1), 
     (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1),
     (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1) + (24/1),  
     Case @Id When Null Then 0 Else Id End

или

    SELECT 'ALL' as GeogType, CAST(v.AdmissionOn as date) as dtAdmission,
         (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) as timeInterval,  
         CAST((DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * 
              (24/1) as nvarchar) + ':00' as fromTime, 
         CAST((DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * 
              (24/1) + (24/1) as nvarchar) + ':00' as toTime, 
         @Id Id, COUNT(*) as nVisits
    FROM dbo.Table1 v 
        JOIN dbo.Table2 t 
          ON v.FSLDU = t.FSLDU5
    WHERE v.AdmissionOn >= '01-01-2010' 
       AND v.AdmissionOn < DATEADD(day,1,'02-01-2010') 
       AND v.ID = Coalesce(@id,ID)      
  GROUP BY CAST(v.AdmissionOn as date), 
     (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1), 
     (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1),
     (DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1) + (24/1),  
     @Id
2 голосов
/ 22 марта 2011

GROUP BY @id вместо GROUP BY v.id и замените v.id на @id в операторе SELECT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...