Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
Hopfen_Artur
Member

Откуда:
Сообщений: 79
Добрый день. Допустим есть таблица:
id sum date
145DDFB5-C523-4693-8CBD-04753EE5A348 3 2019-05-07 07:08:16.000
9B89F23D-1551-4C3A-A403-AD7528421113 2 2019-05-07 07:06:16.000
C528FC75-3BAE-40DE-83EC-FE12D2C8B287 1 2019-05-06 07:04:16.000
322C719A-72E9-43E7-A28C-40E5A0E98558 1 2019-05-05 07:02:16.000
DCBAC891-4C76-4D74-BEAA-09E8F3C6B87A 1 2019-05-04 19:02:15.000
7CAF4A82-7876-4F37-9637-20382C1D9A93 0 2019-05-03 19:00:15.000

Можно ли получить сумму данных за день. Но за весь текущий месяц?
Например сейчас 7 мая. Значит нужно 7 строк. И сумму данных за эти дни.
Чтобы на выходе получилась такая таблица:
id day sum
B5569B7E-13E1-47AE-B7EF-6A79CC9A2BD4 1 null
AEA0D1A3-2DC0-41C0-AEB0-443C72C794F4 2 null
BD4771DC-2B14-4875-B265-09C185373E36 3 0
615FC4A1-EE96-4827-ABF1-9C3AA4A635E6 4 1
A1723DD0-1B04-43D5-ADCB-8FC8A9683D005 1
4901A0C9-F729-4D63-BCCA-5F6FE70D053D6 1
BE9F1DF5-DA18-4818-92B3-AF75C1B739657 5


Может ссылка на пример будет. Заранее спасибо.
7 май 19, 08:36    [21879572]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2926
Hopfen_Artur, сделайте таблицу чисел/дат и джойните со своими данными по полю date преобразовав его в тип Date
7 май 19, 08:43    [21879579]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
court
Member

Откуда:
Сообщений: 1771
Или таблицу-календарь или рекурсивное CTE (в котором генерируются нужные даты) лефт-джойнишь со своей таблицей фактов и агрегируешь.
Вроде всё просто ...
7 май 19, 08:44    [21879581]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
982183
Member

Откуда: VL
Сообщений: 3028
А как/зачем генерить id в результирующей таблице?
7 май 19, 08:45    [21879582]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
Hopfen_Artur
Member

Откуда:
Сообщений: 79
Все понял, сейчас попробую и выложу что получилось. Спасибо.
7 май 19, 08:53    [21879587]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
iap
Member

Откуда: Москва
Сообщений: 46810
HandKot
Hopfen_Artur, сделайте таблицу чисел/дат и джойните со своими данными по полю date преобразовав его в тип Date
А зачем?
У него же все нужные строки хранятся в таблице. Если бы нужны были и отсутствующие...
Просто
GROUP BY CAST([date] AS DATE)
7 май 19, 10:17    [21879659]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19108
Hopfen_Artur
Чтобы на выходе получилась такая таблица:
Вообще-то когда показываете исходные данные и нужный результат, делайте так, чтобы они по данным соответствовали друг другу.
7 май 19, 12:25    [21879799]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2926
iap
HandKot
Hopfen_Artur, сделайте таблицу чисел/дат и джойните со своими данными по полю date преобразовав его в тип Date
А зачем?
У него же все нужные строки хранятся в таблице. Если бы нужны были и отсутствующие...
Просто
GROUP BY CAST([date] AS DATE)

как я понял, ему нужно за все даты, а в таблице нет 1 и 2 числа
7 май 19, 12:36    [21879808]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
iap
Member

Откуда: Москва
Сообщений: 46810
HandKot
iap
пропущено...
А зачем?
У него же все нужные строки хранятся в таблице. Если бы нужны были и отсутствующие...
Просто
GROUP BY CAST([date] AS DATE)


как я понял, ему нужно за все даты, а в таблице нет 1 и 2 числа
Точно. Прошу прощения.
7 май 19, 12:38    [21879811]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 3932
iap
HandKot
Hopfen_Artur, сделайте таблицу чисел/дат и джойните со своими данными по полю date преобразовав его в тип Date
А зачем?
У него же все нужные строки хранятся в таблице. Если бы нужны были и отсутствующие...
Просто
GROUP BY CAST([date] AS DATE)


GROUP BY YEAR([date]), MONTH([date])
7 май 19, 12:44    [21879817]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 923
Hopfen_Artur,

WITH
dd AS (
  -- сделайте таблицу чисел/дат и джойните со своими данными по полю date преобразовав его в тип Date
  SELECT
    [date] = DATEADD( DAY, vl.[number] - DATEPART( DAY, GETDATE() ), CONVERT( DATE, GETDATE() ) )
  FROM
    master.dbo.spt_values vl
  WHERE
        vl.[number] BETWEEN 1 AND DATEPART( DAY, GETDATE() )
    AND vl.[type] = 'P'
),
tt AS (
  SELECT
    [date]  = CONVERT( DATE, tt.[date] ),
    [sum]   = SUM( tt.[sum] )
  FROM
    [dbo].[DataTable]
  WHERE
        [date] >= DATEADD( DAY, 1 - DATEPART( DAY, GETDATE() ), CONVERT( DATE, GETDATE() ) )
    AND [date] < GETDATE()
  GROUP BY
    CONVERT( DATE, tt.[date] )
)
SELECT
  [date]  = dd.[date],
  [sum]   = SUM( tt.[sum] )
FROM
  dd
  LEFT JOIN tt ON (
        tt.[date] = dd.[date] )
GROUP BY
  dd.[date]
ORDER BY
  1
;
7 май 19, 13:33    [21879863]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
Посетитель
Member

Откуда:
Сообщений: 1280
Руслан Дамирович
Hopfen_Artur,

WITH
dd AS (
  -- сделайте таблицу чисел/дат и джойните со своими данными по полю date преобразовав его в тип Date
  SELECT
    [date] = DATEADD( DAY, vl.[number] - DATEPART( DAY, GETDATE() ), CONVERT( DATE, GETDATE() ) )
  FROM
    master.dbo.spt_values vl
  WHERE
        vl.[number] BETWEEN 1 AND DATEPART( DAY, GETDATE() )
    AND vl.[type] = 'P'
),
tt AS (
  SELECT
    [date]  = CONVERT( DATE, tt.[date] ),
    [sum]   = SUM( tt.[sum] )
  FROM
    [dbo].[DataTable]
  WHERE
        [date] >= DATEADD( DAY, 1 - DATEPART( DAY, GETDATE() ), CONVERT( DATE, GETDATE() ) )
    AND [date] < GETDATE()
  GROUP BY
    CONVERT( DATE, tt.[date] )
)
SELECT
  [date]  = dd.[date],
  [sum]   = SUM( tt.[sum] )
FROM
  dd
  LEFT JOIN tt ON (
        tt.[date] = dd.[date] )
GROUP BY
  dd.[date]
ORDER BY
  1
;


declare @DataTable table ([sum] int,[Date] datetime)
insert @DataTable
values (3,	'2019-05-07 07:08:16')
      ,(2,	'2019-05-07 07:06:16')
      ,(1,	'2019-05-06 07:04:16')
      ,(1,	'2019-05-05 07:02:16')
      ,(1,	'2019-05-04 19:02:15')
      ,(0,	'2019-05-03 19:00:15');   

with a as (select cast(getdate() as date) as Ondate)
    ,x as (select dateadd(d,-vl.[number], a.OnDate) Dt
            FROM master.dbo.spt_values vl, a
           WHERE vl.type = 'P'
             and vl.[number]<datepart(day,a.Ondate))
select x.Dt,isnull(sum(sum(d.[sum]))over(order by x.Dt),0) s
 from x
 left join @DataTable d
   on d.[Date]>=x.Dt 
  and d.[Date]<dateadd(dd,1,x.Dt)
 group by x.Dt
7 май 19, 13:53    [21879881]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6420
Посетитель,

Осталось выяснить зачем это
7 май 19, 13:56    [21879884]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
Посетитель
Member

Откуда:
Сообщений: 1280
TaPaK
Посетитель,

Осталось выяснить зачем это

данные за каждый день месяца нарастающим итогом?
да мало ли зачем бузинесу оно надо.
7 май 19, 13:59    [21879888]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
Посетитель
Member

Откуда:
Сообщений: 1280
Посетитель
TaPaK
Посетитель,

Осталось выяснить зачем это

данные за каждый день месяца нарастающим итогом?
да мало ли зачем бузинесу оно надо.

о. так ему не нарастающим итогом.
тогда я мимо кассы)
7 май 19, 14:00    [21879891]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
Посетитель
Member

Откуда:
Сообщений: 1280
Собственно, раз уж начал, чо б и не поправить
declare @DataTable table ([sum] int,[Date] datetime)
insert @DataTable
values (3,	'2019-05-07 07:08:16')
      ,(2,	'2019-05-07 07:06:16')
      ,(1,	'2019-05-06 07:04:16')
      ,(1,	'2019-05-05 07:02:16')
      ,(1,	'2019-05-04 19:02:15')
      ,(0,	'2019-05-03 19:00:15');   

with a as (select cast(getdate() as date) as Ondate)
    ,x as (select dateadd(d,-vl.[number], a.OnDate) Dt
            FROM master.dbo.spt_values vl, a
           WHERE vl.type = 'P'
             and vl.[number]<datepart(day,a.Ondate))
--select x.Dt,isnull(sum(sum(d.[sum]))over(order by x.Dt),0) s
select x.Dt,datepart(day,x.Dt)[Day],sum(d.[sum]) s
 from x
 left join @DataTable d
   on d.[Date]>=x.Dt 
  and d.[Date]<dateadd(dd,1,x.Dt)
 group by x.Dt
7 май 19, 14:09    [21879911]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите можно ли сделать выпорку за текущий месяц и разбить ее по дням?  [new]
Hopfen_Artur
Member

Откуда:
Сообщений: 79
Всем спасибо большое, у самого так и не вышло.
8 май 19, 08:33    [21880613]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить