Начало » Использование СУБД » Microsoft SQL Server » вывод таблицы с пустыми полями (не знаю как сделать групировку) 
	
		
		
			| вывод таблицы с пустыми полями [сообщение #1510] | 
			Mon, 30 January 2023 00:03   | 
		 
		
			
				
				
				
					
						  
						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: вывод таблицы с пустыми полями [сообщение #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
						 Сообщений: 393 Зарегистрирован: June 2022 
						
					 | 
					Senior Member  | 
					 | 
		 
		 
	 | 
 
	
		Добрый Э - Эх писал(а) Wed, 01 February 2023 12:40BlackEric писал(а) Mon, 30 January 2023 14:14Это через временные таблицы делается. В одну сложил итоги за день, потом по ним посчитал итоги за месяц и в другую. Потом за год и все вывел. 
Временные таблицы, конечно, инструмент хороший, но именно в этой задаче они не нужны 
На самом деле это зависит от объема данных (времени выполнения запроса). Если все будет долго считаться, то лучше посчитанные итоги сохранять.
		
		
		
 |  
	| 
		
	 | 
 
 
 |   
Переход к форуму:
 
 Текущее время: Tue Nov 04 03:57:04 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.00744 секунд 
 |