2015-04-08 6 views
1

Привет У меня есть набор querys для получения данныхКомбинирование querys SQL в одном запросе к

два подсчета строк в течение дня и две ночи за то, что я хотел бы, чтобы объединить их в один для запроса.

SELECT controllerID 
    ,COUNT(CardID) AS GoodCountDay 
FROM ReaderData 
WHERE (
     ReaderTime BETWEEN '08:00:00' 
      AND '20:00:00' 
     ) 
    AND (CardID = 'fffffff0') 
    AND (DATEDIFF(DAY, DATEADD(DAY, - 0, CURRENT_TIMESTAMP), dtReading) = 0) 
GROUP BY controllerID 

SELECT controllerID 
    ,COUNT(CardID) AS ScrapCountDay 
FROM ReaderData 
WHERE (
     ReaderTime BETWEEN '08:00:00' 
      AND '20:00:00' 
     ) 
    AND (CardID = '007CF00B') 
    AND (DATEDIFF(DAY, DATEADD(DAY, - 0, CURRENT_TIMESTAMP), dtReading) = 0) 
GROUP BY controllerID 

SELECT controllerID 
    ,COUNT(CardID) AS GoodCountNight 
FROM ReaderData 
WHERE (dtReading >= DATEADD(hour, 20, DATEADD(day, - 1, CAST(CAST(GETDATE() AS DATE) AS DATETIME)))) 
    AND (dtReading < DATEADD(hour, 8, CAST(CAST(GETDATE() AS DATE) AS DATETIME))) 
GROUP BY controllerID 

SELECT controllerID 
    ,count(CardID) AS ScrapCountNight 
FROM ReaderData 
WHERE dtReading >= dateadd(hour, 20, dateadd(day, - 1, cast(cast(getdate() AS DATE) AS DATETIME))) 
    AND dtReading < dateadd(hour, 8, cast(cast(getdate() AS DATE) AS DATETIME)) 
    AND (CardID = '007CF00B') 
GROUP BY controllerID 

Все эти querys имеют один и тот же из пут, который выглядит как этот

controllerID GoodCountDay 
      2 207 
      28 245 
      30 267 
      33 314 
      35 471 
      37 65 
      38 17 
      40 175 

Есть ли способ, я могу объединить их, чтобы один запрос, так что из пут будет такой

controllerID GoodCountDay ScrapCountDay GoodCountNight ScrapCountNight 
     2   207    12    123    1 
     28   245    123 
     30   267   
     33   314 
     35   471 
     37   65 
     38   17 
     40   175 

ответ

7

Вы можете использовать условную агрегацию:

SELECT controllerID, 
     SUM(CASE WHEN ReaderTime BETWEEN '08:00:00' AND '20:00:00' AND 
        DATEDIFF(DAY, DATEADD(DAY, - 0, CURRENT_TIMESTAMP), dtReading) = 0) AND 
        CardID = 'fffffff0' THEN 1 ELSE 0 END) as GoodCountDay 
     SUM(CASE WHEN ReaderTime BETWEEN '08:00:00' AND '20:00:00' AND 
        DATEDIFF(DAY, DATEADD(DAY, - 0, CURRENT_TIMESTAMP), dtReading) = 0) AND 
        CardID = '007CF00B' THEN 1 ELSE 0 END) as ScrapCountDay, 
     SUM(CASE WHEN dtReading >= DATEADD(hour, 20, DATEADD(day, - 1, CAST(CAST(GETDATE() AS date) AS datetime)))) AND 
        (dtReading < DATEADD(hour, 8, CAST(CAST(GETDATE() AS date) AS datetime)) AND 
        CardID = 'fffffff0' THEN 1 ELSE 0 END) as GoodCountNight 
     SUM(CASE WHEN dtReading >= DATEADD(hour, 20, DATEADD(day, - 1, CAST(CAST(GETDATE() AS date) AS datetime)))) AND 
        (dtReading < DATEADD(hour, 8, CAST(CAST(GETDATE() AS date) AS datetime)) AND 
        CardID = '007CF00B' THEN 1 ELSE 0 END) as ScrapCountNight 
FROM ReaderData 
group by controllerID; 
Смежные вопросы