Вопрос о Crystal Reports + хранимая процедура SQL Server с GROUP BY - PullRequest
0 голосов
/ 07 июня 2011

Я пишу отчет в Crystal Reports XI Developer, который выполняет хранимую процедуру в базе данных SQL Server 2005. Набор записей возвращает сводку из таблицы журнала, сгруппированной по дням и часам.

В настоящее время мой запрос выглядит примерно так:

SELECT
    sum(colA) as "Total 1", 
    day(convert(smalldatetime, convert(float, Timestamp) / 1440 - 1)) as "Date",
    datepart(hh, convert(smalldatetime, convert(float, Timestamp) / 1440 - 1)) as "Hour"
    `etc...`
GROUP BY 
    Day, Hour

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

Моя проблема заключается в следующем: поскольку не всегда есть записи по каждому часу дня, я получаю пробелы, которые понятны, но я бы хотел, чтобы Crystal могла отчитываться за все 24 часа независимо от того, есть ли данные или нет.

Я знаю, что могу изменить это, поместив весь запрос в цикл WHILE (в пределах хранимой процедуры) и выполняя запросы в отдельные часы, но что-то внутри меня говорит, что один запрос лучше, чем 24.

Я хотел бы знать, есть ли способ заставить Crystal выполнять итерацию по часам дня, а не итерацию по строкам в таблице, как обычно.

В качестве альтернативы, есть ли способ отформатировать запрос так, чтобы он включал пустые строки часа, не убивая мой сервер базы данных?

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Вы можете использовать предложение WITH для создания 24 часов, а затем OUTER присоединиться к нему.

WITH hours AS (

  SELECT 1 AS hour
  UNION
  SELECT 2 AS hour
  ...
  SELECT 24 AS hour

)

SELECT *
FROM hours h
LEFT OUTER JOIN [your table] x ON h.hour=x.datepart(hh, convert(smalldatetime, convert(float, Timestamp) / 1440 - 1))

Этот SQL нужно будет добавить в команду.

Сгруппируйте по необходимости вSQL или отчет.

2 голосов
/ 07 июня 2011

Вот как я решил эту проблему:

  1. Создайте локальную таблицу на вашем SQL-сервере. Назовите это «LU_Hours».
  2. Эта таблица будет иметь 1 целое поле (называемое «Часы») с 24 строками. Конечно, значения будут от 1 до 24.
  3. Правильно присоедините это к существующему запросу.
  4. Возможно, вам придется настроить это, чтобы убедиться, что пустые часы обработаны к вашему удовлетворению.
...