2014-02-06 8 views
0

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

Я пытаюсь сделать следующее:

  1. Выбрать записи между определенные даты

  2. Количество записей, данные условия в где заявление. У меня есть 6 разных записей для подсчета, для чего потребуется новый столбец для каждого счета.

  3. Затем я хочу Группе A или B

я могу рассчитывать записи, как так далее.

 SELECT  (SELECT  COUNT(*) AS 6F 
         FROM   dbo.1_Data 
         WHERE  ([B] BETWEEN 1 AND 9) AND (Time BETWEEN CONVERT(DATETIME, '2014-01-01 00:00:00', 102) AND CONVERT(DATETIME, 
               '2014-02-01 00:00:00', 102))) AS 6F, 
         (SELECT  COUNT(*) AS 5E 
          FROM   dbo.1_Data AS 1_Data_1 
          WHERE  ([B] = 10) AND (Time BETWEEN CONVERT(DATETIME, '2014-01-01 00:00:00', 102) AND CONVERT(DATETIME, '2014-02-01 00:00:00', 
                 102))) AS 5E, 
         (SELECT  COUNT(*) AS 4D 
          FROM   dbo.1_Data AS 1_Data_2 
          WHERE  ([B] BETWEEN 11 AND 13) AND (Time BETWEEN CONVERT(DATETIME, '2014-01-01 00:00:00', 102) AND CONVERT(DATETIME, 
                '2014-02-01 00:00:00', 102))) AS 4D, 
         (SELECT  COUNT(*) AS 1A 
          FROM   dbo.1_Data AS 1_Data_3 
          WHERE  ([B] = 14) AND (Time BETWEEN CONVERT(DATETIME, '2014-01-01 00:00:00', 102) AND CONVERT(DATETIME, '2014-02-01 00:00:00', 
                 102))) AS 1A, 
         (SELECT  COUNT(*) AS 2B 
          FROM   dbo.1_Data AS 1_Data_4 
          WHERE  ([A Step] BETWEEN 1 AND 25) AND (Time BETWEEN CONVERT(DATETIME, '2014-01-01 00:00:00', 102) AND CONVERT(DATETIME, 
                '2014-02-01 00:00:00', 102))) AS 2B, 
         (SELECT  COUNT(*) AS 3C 
          FROM   dbo.1_Data AS 1_Data_5 
          WHERE  ([B Step] = 0) AND ([ A Step] = 0) AND (Time BETWEEN CONVERT(DATETIME, '2014-01-01 00:00:00', 102) AND 
                CONVERT(DATETIME, '2014-02-01 00:00:00', 102))) AS 3C 

Я могу сделать это, чтобы получить количество записей на данном этапе во время диапазона и сгруппировать.

SELECT COUNT([B]) AS [1A], Letter 

    FROM dbo.1_Data 

    WHERE (Time BETWEEN CONVERT(DATETIME, '2014-01-05 00:00:00', 102) AND CONVERT(DATETIME, '2014-01-10 00:00:00', 102)) AND ([B] = 14) 

    GROUP BY Letter 

Я ищу окончательные результаты, чтобы посмотреть что-то похожее на это. С именем столбца сверху и количеством записей ниже.

Колонна 1А, с подсчета записей для A и B. рассчитывать на

| 1A | Письмо |


| 34 | A |


| 93 | B |

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

ответ

0

Я до сих пор путают, что вы хотите, но я думаю, что вам это нужно

SELECT COUNT(CASE WHEN ([B] BETWEEN 1 AND 9) 
         AND ([Time] BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00') THEN 1 
        ELSE NULL 
      END) AS '6f' 
     ,COUNT(CASE WHEN ([B] = 10) 
         AND ([Time] BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00') THEN 1 
        ELSE NULL 
       END) AS '5E' 
     ,COUNT(CASE WHEN ([B] BETWEEN 11 AND 13) 
         AND ([Time] BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00') THEN 1 
        ELSE NULL 
       END) AS '4D' 
     ,COUNT(CASE WHEN ([B] = 14) 
         AND ([Time] BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00') THEN 1 
        ELSE NULL 
       END) AS '1A' 
     ,COUNT(CASE WHEN ([A Step] BETWEEN 1 AND 25) 
         AND ([Time] BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00') THEN 1 
        ELSE NULL 
       END) AS '2B' 
     ,COUNT(CASE WHEN [B Step] = 0 
         AND [ A Step] = 0 
         AND ([Time] BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00') THEN 1 
        ELSE NULL 
       END) AS '3C' 
    FROM dbo.[1_Data] 
  • Вам не нужно преобразовать «2014-01-01» в DATETIME SQL Server будет делать это автоматически
  • Вы можете разместить логику внутри оператора CASE и COUNT результат CASE заявление, при подсчете не забудьте NULL ваши результаты в противном случае он будет считать все.
+0

Это сработало. Я надеялся, что вам нужно будет только изменить StartDate и EndDate один раз. Но я могу решить это с помощью параметров хранимой процедуры. Благодарим за помощь. Я отметил ваш ответ. – user2644176

+0

Nevermind. Виноват. Это будет отлично работать с правильным там, где есть заявление. Еще раз спасибо за помощь в этом. – user2644176

Смежные вопросы