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

Откуда:
Сообщений: 4
Всем доброго времени суток!

Есть условно такая таблица в базе MS SQL:

Флора - Вид - Дата
Деревья - Березы - 2020-02-10 18:54:00.0000000
Деревья - Ель - 2020-02-10 07:16:00.0000000
Деревья - Ель - 2020-02-10 07:18:00.0000001
Деревья - Ель - 2020-02-10 07:19:00.0000002
Деревья - Сосна - 2020-02-09 14:50:00.0000000
Деревья - Сосна - 2020-02-10 14:00:00.0000001
Деревья - Тополь - 2020-02-08 02:02:00.0000000
Травы - Лопух - 2020-02-10 11:52:00.0000000
Травы - Мята - 2020-02-09 11:32:00.0000000
Цветы - Пионы - 2020-02-10 05:05:00.0000000
Цветы - Пионы - 2020-02-08 06:01:00.0000001
Цветы - Розы - 2020-02-09 11:53:00.0000000
Цветы - Ромашки - 2020-02-08 13:26:00.0000000
Цветы - Герберы - 2020-02-08 11:59:00.0000000
Цветы - Герберы - 2020-02-09 12:59:00.0000001
Цветы - Герберы - 2020-02-08 10:59:00.0000002



Необходимо, что суммарное кол-во по столбцу Вид отображалось за Сегодня, Вчера, Позавчера, т.е. итог такой:

Флора - Вид - Сегодня - Вчера - Позавчера
Деревья - Березы - 1 - 0 - 0
Деревья - Ель - 3 - 0 - 0
Деревья - Сосна - 1 - 1 - 0
Деревья - Тополь - 0 - 0 - 1
Травы - Лопух - 1 - 0 - 0
Травы - Мята - 0 - 1 - 0
Цветы - Пионы - 1 - 0 - 1
Цветы - Розы - 0 - 1 - 0
Цветы - Ромашки - 0 - 0 - 1
Цветы - Герберы - 0 - 1 - 2


Только менять каждый день в запросе даты - не подходит, необходимо, чтобы при выполнении запроса автоматом выводились данные за Сегодня, Вчера, Позавчера.

Подскажите, пожалуйста, как можно сделать?
Различные манипуляции с GETDATE и DATEADD не помогают (или делаю что-то не то) :(

P.S.: прошу тапками не кидаться сразу, только учусь SQL :)
10 фев 20, 18:19    [22077066]     Ответить | Цитировать Сообщить модератору
 Re: Вывод данных за Сегодня, Вчера, Позавчера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30460
Tenya
Подскажите, пожалуйста, как можно сделать?
Сделать это можно либо операцией PIVOT, либо SUM+CASE.

Вы сделайте скрипт с созданием временной таблицы, и наполнением её тестовыми данными, вам помогут.
10 фев 20, 18:24    [22077071]     Ответить | Цитировать Сообщить модератору
 Re: Вывод данных за Сегодня, Вчера, Позавчера  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6789
Tenya,

today => CAST(date as date) = CAST(getdate() as date)
yesterday => CAST(date as date) = DATEADD(day,-1,CAST(getdate() as date))
day before yesterday =>CAST(date as date) = DATEADD(day,-2,CAST(getdate() as date))

ну и SUM(CASE WHEN ... THEN 1 ELSE 0)
10 фев 20, 18:24    [22077073]     Ответить | Цитировать Сообщить модератору
 Re: Вывод данных за Сегодня, Вчера, Позавчера  [new]
entrypoint
Member

Откуда:
Сообщений: 227
Tenya,

-- Тестовые данные
DECLARE @t AS TABLE
                    ([Флора] VARCHAR(10) NOT NULL
                   , [Вид]   VARCHAR(10) NOT NULL
                   , [Дата]  DATETIME2(7) NOT NULL
                    );
INSERT INTO @t
                    ([Флора] 
                   , [Вид]   
                   , [Дата]  
                    )
SELECT 'Деревья',  'Березы', '20200210 18:54:00.0000000' UNION ALL
SELECT 'Деревья',  'Ель', '20200210 07:16:00.0000000' UNION ALL
SELECT 'Деревья',  'Ель', '20200210 07:18:00.0000001' UNION ALL
SELECT 'Деревья',  'Ель', '20200210 07:19:00.0000002' UNION ALL
SELECT 'Деревья',  'Сосна', '20200209 14:50:00.0000000' UNION ALL
SELECT 'Деревья',  'Сосна', '20200210 14:00:00.0000001' UNION ALL
SELECT 'Деревья',  'Тополь', '20200208 02:02:00.0000000' UNION ALL
SELECT 'Травы', 'Лопух', '20200210 11:52:00.0000000' UNION ALL
SELECT 'Травы', 'Мята', '20200209 11:32:00.0000000' UNION ALL
SELECT 'Цветы', 'Пионы', '20200210 05:05:00.0000000' UNION ALL
SELECT 'Цветы', 'Пионы', '20200208 06:01:00.0000001' UNION ALL
SELECT 'Цветы', 'Розы', '20200209 11:53:00.0000000' UNION ALL
SELECT 'Цветы', 'Герберы', '20200209 12:59:00.0000001' UNION ALL
SELECT 'Цветы', 'Ромашки', '20200208 13:26:00.0000000' UNION ALL
SELECT 'Цветы', 'Герберы', '20200208 11:59:00.0000000' UNION ALL
SELECT 'Цветы', 'Герберы', '20200208 10:59:00.0000002'

-- Решение
SELECT 
       t.[Флора]
     , t.[Вид]
     , COUNT(CASE WHEN CONVERT(DATE,  t.[Дата]) = CONVERT(DATE, GETDATE()) THEN t.[Дата] END) AS [Сегодня]
     , COUNT(CASE WHEN CONVERT(DATE,  t.[Дата]) = DATEADD(DAY, -1, CONVERT(DATE,  GETDATE())) THEN t.[Дата] END) AS [Вчера]
     , COUNT(CASE WHEN CONVERT(DATE,  t.[Дата]) = DATEADD(DAY, -2, CONVERT(DATE,  GETDATE())) THEN t.[Дата] END) AS [Позавчера]
FROM 
     @t AS t
GROUP BY
       t.[Флора]
     , t.[Вид]
ORDER BY
       t.[Флора]
     , t.[Вид]; 	; 


Флора      Вид        Сегодня     Вчера       Позавчера
---------- ---------- ----------- ----------- -----------
Деревья    Березы     1           0           0
Деревья    Ель        3           0           0
Деревья    Сосна      1           1           0
Деревья    Тополь     0           0           1
Травы      Лопух      1           0           0
Травы      Мята       0           1           0
Цветы      Герберы    0           1           2
Цветы      Пионы      1           0           1
Цветы      Розы       0           1           0
Цветы      Ромашки    0           0           1
10 фев 20, 19:21    [22077130]     Ответить | Цитировать Сообщить модератору
 Re: Вывод данных за Сегодня, Вчера, Позавчера  [new]
Tenya
Member

Откуда:
Сообщений: 4
entrypoint, спасибо огромное!
12 фев 20, 15:17    [22078429]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить