SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Microsoft SQL Server » вывод таблицы с пустыми полями (не знаю как сделать групировку)
- вывод таблицы с пустыми полями [сообщение #1510] Mon, 30 January 2023 00:03 Переход к следующему сообщению
orozbay в настоящее время не в онлайне  orozbay
Сообщений: 1
Зарегистрирован: January 2023
Junior Member
Написать запрос, выводящий итоги по годам – по каждому году общий итог, суммарные итоги за месяц и суммарные итоги за каждый день. Если по какому-либо периоду нет данных – строки не выводить
выводить 104 запроса но не правильно расположены
select
     year(action_date) as year,
     ifnull(null, ' ') as month,
     ' ' as day,
     sum(qty*price) as total
from actions
group by year
union
select    
    ' ',
    month(action_date),
    ' ',
    sum(qty*price)
from actions
group by year(action_date), month(action_date)
union
select
  ' ',
    ' ',
    day(action_date),
    sum(qty*price)
from actions
group by year(action_date), month(action_date), day(action_date)
изображение как нужно вывести и изображение как у меня выводиться
- Re: вывод таблицы с пустыми полями [сообщение #1513 является ответом на сообщение #1510] Mon, 30 January 2023 14:14 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 369
Зарегистрирован: June 2022
Senior Member
Это через временные таблицы делается. В одну сложил итоги за день, потом по ним посчитал итоги за месяц и в другую. Потом за год и все вывел.
- Re: вывод таблицы с пустыми полями [сообщение #1522 является ответом на сообщение #1513] Wed, 01 February 2023 12:40 Переход к предыдущему сообщениюПереход к следующему сообщению
Добрый Э - Эх в настоящее время не в онлайне  Добрый Э - Эх
Сообщений: 2
Зарегистрирован: February 2023
Junior Member
BlackEric писал(а) Mon, 30 January 2023 14:14
Это через временные таблицы делается. В одну сложил итоги за день, потом по ним посчитал итоги за месяц и в другую. Потом за год и все вывел.
Временные таблицы, конечно, инструмент хороший, но именно в этой задаче они не нужны
- Re: вывод таблицы с пустыми полями [сообщение #1523 является ответом на сообщение #1510] Wed, 01 February 2023 12:46 Переход к предыдущему сообщениюПереход к следующему сообщению
Добрый Э - Эх в настоящее время не в онлайне  Добрый Э - Эх
Сообщений: 2
Зарегистрирован: February 2023
Junior Member
orozbay писал(а) Mon, 30 January 2023 00:03
Написать запрос, выводящий итоги по годам – по каждому году общий итог, суммарные итоги за месяц и суммарные итоги за каждый день. Если по какому-либо периоду нет данных – строки не выводить
выводить 104 запроса но не правильно расположены
В целом, задача - на знание расширенных функций группировки (rollup, cube, grouping sets).

В качестве небольшой иллюстрации (получение итогов за день, + итогов за месяцев, + итогов за год, + общее итого за весь период, охваченный исходным запросом):
-- Тестовый набор данных:
with 
  b$m_tst_tbl as
    (
      select cast('2023-01-01' as date) as dt, 10 as summ union all
      select cast('2023-01-01' as date) as dt, 10 as summ union all
      select cast('2023-01-02' as date) as dt, 10 as summ union all
      select cast('2023-01-02' as date) as dt, 10 as summ union all
      select cast('2023-02-01' as date) as dt, 10 as summ union all
      select cast('2023-02-01' as date) as dt, 10 as summ union all
      select cast('2023-02-02' as date) as dt, 10 as summ union all
      select cast('2023-02-02' as date) as dt, 10 as summ union all
      select cast('2023-02-02' as date) as dt, 10 as summ union all
      select cast('2023-03-01' as date) as dt, 10 as summ union all
      select cast('2023-03-02' as date) as dt, 10 as summ union all
      select cast('2024-01-01' as date) as dt,  5 as summ union all
      select cast('2024-01-01' as date) as dt,  5 as summ union all
      select cast('2024-01-02' as date) as dt,  5 as summ union all
      select cast('2024-01-02' as date) as dt,  5 as summ union all
      select cast('2024-02-01' as date) as dt,  5 as summ union all
      select cast('2024-02-01' as date) as dt,  5 as summ union all
      select cast('2024-02-02' as date) as dt,  5 as summ union all
      select cast('2024-02-02' as date) as dt,  5 as summ union all
      select cast('2024-02-02' as date) as dt,  5 as summ union all
      select cast('2024-03-01' as date) as dt,  5 as summ union all
      select cast('2024-03-02' as date) as dt,  5 as summ 
	)
--
-- Основной запрос:
select case grouping_id(format(dt,'yyyy-MM-dd'), format(dt, 'yyyy-MM'), format(dt, 'yyyy')) 
         when 3 then 'За день:  ' + format(dt,'yyyy-MM-dd')
         when 5 then 'За месяц: '+ format(dt, 'yyyy-MM')
         when 6 then 'ЗА ГОД: '+ format(dt, 'yyyy')
         when 7 then 'ИТОГО: '
         else 'х.з. :)'
       end as [Период]
     , sum(summ) as [Сумма]
     , count(summ) as [Кол-во]
  from b$m_tst_tbl
 group by grouping sets(format(dt,'yyyy-MM-dd'), format(dt, 'yyyy-MM'), format(dt, 'yyyy'),())
 order by coalesce(
                      format(dt,'yyyy-MM-dd')
                    , format(dt,'yyyy-MM')+'-33'
                    , format(dt,'yyyy')+'-13-00'
                    , '9999-99-99'
                  );
- Re: вывод таблицы с пустыми полями [сообщение #1525 является ответом на сообщение #1522] Wed, 01 February 2023 17:28 Переход к предыдущему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 369
Зарегистрирован: June 2022
Senior Member
Добрый Э - Эх писал(а) Wed, 01 February 2023 12:40
BlackEric писал(а) Mon, 30 January 2023 14:14
Это через временные таблицы делается. В одну сложил итоги за день, потом по ним посчитал итоги за месяц и в другую. Потом за год и все вывел.
Временные таблицы, конечно, инструмент хороший, но именно в этой задаче они не нужны
На самом деле это зависит от объема данных (времени выполнения запроса). Если все будет долго считаться, то лучше посчитанные итоги сохранять.
Предыдущая тема: Создание таблицы в Microsoft SQL Server Management Studio
Следующая тема: Получение в переменную выходных данных из инструкции EXEC
Переход к форуму:
  


Текущее время: Mon Dec 30 05:37:33 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00757 секунд