Группировка по отдельным значениям - PullRequest
2 голосов
/ 04 января 2012

Мне после некоторой помощи ( MSChart - принуждение линейного графика к рисованию из источника ) удалось собрать следующий MSSQL-запрос для использования в линейном графике.

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
    MIN(ad.days) AS Date,
    ISNULL((SELECT SUM(value) FROM jobs WHERE dateinvoiced >= CAST('20120101'
    as datetime) AND dateinvoiced <= ad.days)/100,0) AS Value
FROM AllDays AS ad
LEFT JOIN jobs AS j
ON( ad.days = j.dateinvoiced )

GROUP BY ad.days

Однако у меня есть проблема.Этот запрос возвращает что-то вроде следующего:

Date                    | Value

2012-01-01 00:00:00.000 |     0 
2012-01-02 00:00:00.000 |     0
2012-01-03 00:00:00.000 |  1234
2012-01-04 00:00:00.000 |  1234
2012-01-05 00:00:00.000 |  1234
2012-01-06 00:00:00.000 | 57312
2012-01-07 00:00:00.000 | 57312
2012-01-08 00:00:00.000 | 90812

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

Date                    | Value

2012-01-01 00:00:00.000 |     0
2012-01-03 00:00:00.000 |  1234
2012-01-06 00:00:00.000 | 57312
2012-01-08 00:00:00.000 | 90812

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

Есть идеи?Заранее спасибо.

Редактировать: извините за хитрые таблицы, моя первая попытка была намного хуже.

1 Ответ

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

Попробуй это.Вы уже сделали сложную часть.Вам просто нужно сгруппироваться по Value и получить первое (т.е. MIN) Date, связанное с ним:

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)
), V AS (
  SELECT
    MIN(ad.days) AS Date,
    ISNULL((SELECT SUM(value) FROM jobs WHERE dateinvoiced >= CAST('20120101'
    as datetime) AND dateinvoiced <= ad.days)/100,0) AS Value
  FROM AllDays AS ad
  LEFT JOIN jobs AS j ON (ad.days = j.dateinvoiced)
  GROUP BY ad.days
)
SELECT MIN(Date) Date, Value
FROM V
GROUP BY Value;
...