выберите между годами случай, когда заявление - PullRequest
1 голос
/ 14 ноября 2011

Я написал запрос

 WITH sample AS (
  SELECT CAST('2010-01-01' AS DATETIME) AS d
  UNION ALL
  SELECT DATEADD(dd, 1, i.vrp_notificationdate) as deneme
    FROM Incident i
   WHERE DATEADD(dd, 1, i.vrp_notificationdate) <= CAST('2011-11-01' AS DATETIME))
SELECT count(DATENAME(mm,l.vrp_notificationdate) +' '+DATENAME(yy,l.vrp_notificationdate)) as Toplam,DATENAME(mm,l.vrp_notificationdate) +' '+DATENAME(yy,l.vrp_notificationdate)
  FROM Incident as l
  group by  
  DATENAME(mm,l.vrp_notificationdate) +' '+DATENAME(yy,l.vrp_notificationdate)

запрос на показ

10    November 2011
101   October 2011
4 September 2011

но я хочу показать это.

 0 january 2010
 0 february 2010
 -
 -
 -
 10 November 2011
 101 October 2011
 4 september 2011
 0 december  2011
 0 february  2011

я пробовал случай когда оператор, но запрос показывает тот же результат Как решить, что я использую

С уважением.

Ответы [ 3 ]

2 голосов
/ 14 ноября 2011

Вы пытаетесь показать данные, которые не существуют. Идея этого решения заключается в

  • Добавить фиктивные даты
  • Назначить счет 0 для каждой фиктивной даты
  • Объедините ваши исходные результаты с этими фиктивными датами
  • Группировка в окончательный результат

Оператор SQL

DECLARE @StartDate DATE = '01-01-2010'
;WITH Dates(d) AS (
  SELECT @StartDate
  UNION ALL
  SELECT  DATEADD(mm, 1, d) AS Date
  FROM    Dates
  WHERE   d < '12-01-2012'
)       
,WITH sample AS (
  SELECT  CAST('2010-01-01' AS DATETIME) AS d
  UNION ALL
  SELECT  DATEADD(dd, 1, i.vrp_notificationdate) as deneme
  FROM    Incident i
  WHERE   DATEADD(dd, 1, i.vrp_notificationdate) <= CAST('2011-11-01' AS DATETIME)
)
SELECT  SUM(Toplam) AS Toplam
        , DateFormat
FROM    (
          SELECT  COUNT(DATENAME(mm,l.vrp_notificationdate) + ' ' + DATENAME(yy,l.vrp_notificationdate)) AS Toplam
                  , DATENAME(mm,l.vrp_notificationdate) + ' ' + DATENAME(yy,l.vrp_notificationdate) AS DateFormat
                  , CONVERT(VARCHAR(6), l.vrp_notificationdate, 112) as orderDate
          FROM    Incident as l
          GROUP BY
                  DATENAME(mm,l.vrp_notificationdate) + ' ' + DATENAME(yy,l.vrp_notificationdate)
                  , CONVERT(VARCHAR(6), l.vrp_notificationdate, 112)
          UNION ALL       
          SELECT  0 AS Toplam
                  , DATENAME(mm, d) + ' ' + DATENAME(yy, d)
                  , CONVERT(VARCHAR(6), d.d, 112) as orderDate
          FROM    Dates d
        ) g
GROUP BY
        DateFormat                  
ORDER BY
        g.orderDate
0 голосов
/ 14 ноября 2011

Почему вы предоставляете "WITH sample AS", если вы не используете sample?

Я буду использовать этот рекурсивный запрос для построения всех дат для вашей таблицы результатов.

WITH sample (d) AS ( 
    SELECT CAST('2010-01-01' AS DATETIME)
    UNION ALL
    SELECT DATEADD(mm, 1, d) FROM sample WHERE DATEADD(mm, 1, d) <= CAST('2011-11-01' AS DATETIME)
)
select * from sample

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

Если вы хотите видеть много месяцев или даже дней, вы можете получить MSG 530 из-за слишком большой рекурсии. В этом случае вам нужно добавить OPTION (MAXRECURSION) после «select * from sample».

0 голосов
/ 14 ноября 2011

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

Чтобы передать это, самое простое решение:

  1. Создать таблицу со всеми возможными датами и другим столбцом, которыйбудет начинаться с нуля.
  2. Обновите эту таблицу результатами вашего запроса (обновите столбец, начинающийся с нуля, чтобы получить значения счетчика).
  3. Показать конечные результаты изновая таблица:
select countValues + ' ' + dateValues from newTable

Если у вас есть какие-либо сомнения, просто спросите:)

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