2013-02-27 6 views
0

У меня есть простой запрос SQL с предложениями GROUP BY, HAVING и ORDER BY. Предложение HAVING имеет некоторые поля, которые я не хочу в GROUP BY, возможно ли это? Потому что мне приходится группировать данные ежечасно, и у меня есть поле даты в HAVING, поэтому группировка не работает должным образом. Код:группа по колонке, не присутствующей в заключении

alter procedure [dbo].[sp_metadata_inflow] 
@grp_name varchar(40) , @subgrp_name varchar(40) 
as 
begin 
declare @i as int , @j as int,@k as int,@d as datetime , @m as datetime,@y as datetime; 
set @d = datepart(day,'2012-12-13 10:54:55.000'); 
set @m = datepart(month,'2012-12-13 10:54:55.000'); 
set @y = datepart(YEAR,'2012-12-13 10:54:55.000'); 
set @i = 1; 
set @j = @i - 1; 
while (@i <=24) 
begin 
(SELECT top 5 @i, 
     ContactReason, 
     @grp_name, 
     @subgrp_name, 
     COUNT(*) 
FROM [ISRM].[dbo].[ITSM01ISRM] 
GROUP BY ContactReason,datepart(day,CreatedDate),CurrentGroup,CurrentSubGroup 
HAVING (
     datepart(day,CreatedDate)= @d AND datepart(MONTH,CreatedDate)= @m 
     AND datepart(year,CreatedDate) = @y AND datepart(hour,CreatedDate) <= @i 
     AND datepart(hour,CreatedDate) >[email protected] 
     ) 
     AND (CurrentGroup = @grp_name) AND (CurrentSubGroup = @subgrp_name) 
); 
set @i = @i + 1; 
set @j = @i -1; 
end 
end 
go 
+0

Можете ли вы объяснить ваш запрос? Я имею в виду то, что вы хотите сделать, используя запрос в действительности? – Dhwani

+0

Итак, я хочу получить счет (*), основанный на контакте Reason (group by), за каждый час дня ... Надеюсь, что это имеет смысл, Мой единственный вопрос - как я могу получить его, не создавая CreateDate в group by by – user2042493

+0

В MySQL (хотя и не стандартном SQL) есть столбцы в предложении HAVING, которые не входят в GROUP BY. См. Http://dev.mysql.com/doc/refman/4.1/en/group-by-hidden-columns.html – GreyBeardedGeek

ответ

0

Следующие группы запросов все результаты по часам. Почему вы не хотите, чтобы CreateDate в GROUP BY?

SELECT 
    ContactReason, 
    CurrentGroup, 
    CurrentSubGroup, 
    dateadd(hour, datediff(hour, 0, CreatedDate), 0), 
    COUNT(1) 
FROM [ISRM].[dbo].[ITSM01ISRM] 
WHERE 
    (CurrentGroup = @grp_name) AND (CurrentSubGroup = @subgrp_name) 
GROUP BY 
    ContactReason, 
    dateadd(hour, datediff(hour, 0, CreatedDate), 0), 
    CurrentGroup, 
    CurrentSubGroup; 
0

Чтобы ответить на ваш вопрос, похоже, что вы просто хотите использовать эти условия в разделе where. Он также очень похож на синтаксис SQL-Server, а не на MySQL, как предлагают теги.

Также стоит отметить, что это очень неэффективно:

(datepart(day,CreatedDate)= @d 
AND datepart(MONTH,CreatedDate)= @m 
AND datepart(year,CreatedDate) = @y 
AND datepart(hour,CreatedDate) <= @i 
AND datepart(hour,CreatedDate) >[email protected]) 

с использованием DATEPART на колонке не только заставить функцию оценки для каждой строки, он также удаляет преимущества любого индекса на колонке , Это было бы гораздо лучше написано как Createddate >= '20130227 00:00' AND CreatedDate < '20130227 01:00'.

Кроме того, каждый цикл, который вы выполняете в течение 2-х часовых периодов, не похож на предполагаемое поведение.

Наконец-то я не могу представить, что возвращение 24 наборов результатов - лучший способ справиться с данными. Если вы хотите, чтобы подсчет для каждого часа не имел смысла иметь часы в виде столбцов и выполнять один запрос и возвращать один набор данных?

например.

| ContactReason | GroupName | SubGroupName | 00:00 | 01:00 | 02:00 | 03:00 |.....| 23:00 | 
|----------------+------------+--------------+-------+-------+-------+-------+.....+-------| 
| Example Reason | Test Group | Sub Group | 5 | 10 | 8 | 1 |.....| 14 | 
| Another Reason | Test Group | Sub Group | 3 | 1 | 13 | 8 |.....| 23 | 

В этом случае ваш запрос может быть записан в виде

DECLARE @Date DATETIME = '20121213'; 

WITH Data AS 
(  SELECT ContactReason, 
       GroupName = @grp_name, 
       SubGroupName = @subgrp_name, 
       CreatedHour = CAST(DATEADD(HOUR, DATEDIFF(HOUR, 0, Createddate), 0) AS TIME), 
       [Value] = 1 
     FROM [ISRM].[dbo].[ITSM01ISRM] 
     WHERE CurrentGroup = @grp_name 
     AND  CurrentSubGroup = @subgrp_name 
     AND  CreatedDate >= @Date 
     AND  CreatedDate < DATEADD(DAY, 1, @Date) 
) 
SELECT * 
FROM Data 
     PIVOT 
     ( COUNT(Value) 
      FOR CreatedHour IN 
       ( [00:00], [01:00], [02:00], [03:00], [04:00], [05:00], 
        [06:00], [07:00], [08:00], [09:00], [10:00], [11:00], 
        [12:00], [13:00], [14:00], [15:00], [16:00], [17:00], 
        [18:00], [19:00], [20:00], [21:00], [22:00], [23:00] 
     ) pvt; 
Смежные вопросы