MSChart - Принудительное рисование линейного графика из источника - PullRequest
0 голосов
/ 04 января 2012

У меня есть диаграмма привязки данных, запущенная из следующего запроса MSSQL -

"SELECT dateinvoiced AS Date, (SELECT SUM(value) FROM jobs WHERE dateinvoiced >= '" + 
new DateTime(year, month, 1).ToString("yyyy-MM-dd") + "' AND dateinvoiced <= 
j.dateinvoiced)/100 AS Revenue FROM jobs j WHERE dateinvoiced >= '" + new 
DateTime(year, month, 1).ToString("yyyy-MM-dd") + "' AND dateinvoiced <= '" + new 
DateTime(year, month, daysInMonth).ToString("yyyy-MM-dd") + "' GROUP BY dateinvoiced"

(Пожалуйста, прости, что я представляю себе странный способ обработки дат, длинную историю, но я скоро их поменяю.)

Запрос получает совокупную сумму денег, потраченных на работу, которую бизнес пользователя выполнил за день в течение календарного месяца. Сам график сравнивает это с целевым значением для месяца, поэтому пользователь может видеть прогресс в достижении своей ежемесячной цели. С этой стороны все работает нормально, и запрос тоже. Проблема наступает в начале месяца.

Линия, нарисованная из вышеприведенного запроса, очевидно, начинается с первой точки данных. Если пользователь не взял денег, скажем, до середины месяца, а затем принял большое значение, на графике не будет проведено никакой линии, поскольку присутствует только одна точка. Так будет до тех пор, пока пользователь не возьмет деньги в более поздний день, после чего они увидят линию.

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

Единственный способ заставить это работать самому, это проверить, есть ли данные за 1-й день до привязки к данным, и не просто вставить запись о продаже с нулевой стоимостью в таблицу. Я уверен, вы понимаете, почему это не приемлемо. Есть ли способ вручную добавить точку на таблицу данных? Я пытался и не могу этого сделать. Если это не удастся, есть ли способ изменить запрос SQL, чтобы получить значение для каждой даты, даже если данные для них отсутствуют? Или какие-нибудь другие методы вообще?

Спасибо.

1 Ответ

0 голосов
/ 04 января 2012

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

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

WITH AllDays
AS
(
    SELECT CAST('20120101' as datetime) AS DAYS
    UNION ALL
    SELECT DATEADD(dd, 1, DAYS)
    FROM AllDays
    WHERE DATEADD(dd, 1, DAYS) < cast('20120201' as datetime)
)
SELECT DAYS
FROM AllDays -- consider making the join here as you need
...