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

Откуда:
Сообщений: 2031
Здравствуйте!

Есть SQL запрос. Этот запрос возвращает одну строку. Используется для тестирования. Постоянно корректируется: добавляются и удаляются новые поля, изменяются условия.

Следует учесть, что тип столбцов одинаковое. В некоторых ячейках вместо 0, стоит Null.

+SQL-запрос1
DECLARE @Таблица table (
	[Фактор1] int,
	[Фактор2] int,
	[Фактор3] int,
	[Дата1] date,
	[Дата2] date
);

INSERT INTO
  @Таблица
VALUES 
(1,1,1,'01.02.2018','02.02.2018'),
(1,1,0,'02.02.2018','03.02.2018'),
(1,1,1,'04.02.2018','05.02.2018'),
(1,0,1,'05.02.2018','07.02.2018'),
(1,1,1,'07.02.2018','08.02.2018'),
(1,1,0,'08.02.2018','06.02.2018'),
(1,1,0,'10.02.2018','11.02.2018'),
(1,1,0,'11.02.2018','12.02.2018'),
(0,0,1,'12.02.2018','13.02.2018'),
(Null,1,1,'16.02.2018','17.02.2018')

SELECT
	SUM(CASE WHEN 
			[Фактор1] <> 1 OR [Фактор1] IS NULL 
		THEN 1 ELSE 0 END) AS [Ошибка 1. Отсутствии фактора 1],
	SUM(CASE WHEN
			([Фактор1] <> 1 OR [Фактор1] IS NULL)
			AND
			([Фактор2] <> 1 OR [Фактор2] IS NULL)
		THEN 1 ELSE 0 END) AS [Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2],
	SUM(CASE WHEN
			([Фактор3] <> 1 OR [Фактор3] IS NULL)
			AND
			[Дата1] >= [Дата2]
		THEN 1 ELSE 0 END) AS [Ошибка 3. Отсутствии фактора 3, а также Дата1 больше, чем Дата2],
	Count(*) AS [Количество всего строк]
FROM
	 @Таблица

Ошибка 1. Отсутствии фактора 1Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2Ошибка 3. Отсутствии фактора 3. а также Дата1 больше. чем Дата2Количество всего строк
21110

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

Если написать SQL-запрос по другому, то

+SQL-запрос2
SELECT
	'Ошибка 1. Отсутствии фактора 1',
	SUM(CASE WHEN 
		[Фактор1] <> 1 OR [Фактор1] IS NULL 
	THEN 1 ELSE 0 END)
FROM
	@Таблица

UNION ALL
	
SELECT
	'Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2',
	SUM(CASE WHEN
		([Фактор1] <> 1 OR [Фактор1] IS NULL)
		AND
		([Фактор2] <> 1 OR [Фактор2] IS NULL)
	THEN 1 ELSE 0 END)
FROM
	@Таблица

UNION ALL
	
SELECT
	'Ошибка 3. Отсутствии фактора 3, а также Дата1 больше, чем Дата2',
	SUM(CASE WHEN
		([Фактор3] <> 1 OR [Фактор3] IS NULL)
		AND
		[Дата1] >= [Дата2]
	THEN 1 ELSE 0 END)
FROM
	@Таблица

UNION ALL

SELECT
	'Количество всего строк',
	Count(*)
FROM
	@Таблица

(Отсутствует имя столбца)(Отсутствует имя столбца)
Ошибка 1. Отсутствии фактора 12
Ошибка 2. Одновременное отсутствии фактора 1 и фактора 21
Ошибка 3. Отсутствии фактора 3. а также Дата1 больше. чем Дата21
Количество всего строк10

Вроде как бы возвращает так, как надо, но надо многое в коде менять. И запрос еще получается длиннее. Так как мер очень много.

Но хотелось бы узнать, есть ли у SSMS 2012 возможность выводить данные после запуска SQL-запроса1 сразу вертикально? Или не изменяя SQL-запроса1 дописать запрос так, чтобы выводил вертикально не зависимо от того, какие поля добавляются или удаляются со временем?
21 ноя 18, 15:52    [21740274]     Ответить | Цитировать Сообщить модератору
 Re: Вертикальный вывод результата запроса  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
ferzmikk,

в простейшей конструкции это unpivot

но не динамический, а если вам нужно динамически подцеплять столбцы то можно поиграться с sp_describe_first_result_set + dynamic sql, но там будут свои танцы с бубном. обычно то что Вам надо выполняют на клиенте.

select * from (
SELECT
	SUM(CASE WHEN 
			[Фактор1] <> 1 OR [Фактор1] IS NULL 
		THEN 1 ELSE 0 END) AS [Ошибка 1. Отсутствии фактора 1],
	SUM(CASE WHEN
			([Фактор1] <> 1 OR [Фактор1] IS NULL)
			AND
			([Фактор2] <> 1 OR [Фактор2] IS NULL)
		THEN 1 ELSE 0 END) AS [Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2],
	SUM(CASE WHEN
			([Фактор3] <> 1 OR [Фактор3] IS NULL)
			AND
			[Дата1] >= [Дата2]
		THEN 1 ELSE 0 END) AS [Ошибка 3. Отсутствии фактора 3, а также Дата1 больше, чем Дата2],
	Count(*) AS [Количество всего строк]
FROM
	 @Таблица) src
unpivot 
( c for v in  ([Ошибка 1. Отсутствии фактора 1], [Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2], [Количество всего строк], [Ошибка 3. Отсутствии фактора 3, а также Дата1 больше, чем Дата2])
) as unpvt
21 ноя 18, 17:17    [21740376]     Ответить | Цитировать Сообщить модератору
 Re: Вертикальный вывод результата запроса  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
ferzmikk'

Кнопки "сделай все за меня" точно нет.

используйте unpivot + dynamic sql
21 ноя 18, 17:19    [21740380]     Ответить | Цитировать Сообщить модератору
 Re: Вертикальный вывод результата запроса  [new]
L_argo
Member

Откуда:
Сообщений: 1139
TDBVertGridEh (Ehlib)
21 ноя 18, 17:55    [21740441]     Ответить | Цитировать Сообщить модератору
 Re: Вертикальный вывод результата запроса  [new]
ferzmikk
Member

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

Возвращает такой результат
c v
2 Ошибка 1. Отсутствии фактора 1
1 Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2
1 Ошибка 3. Отсутствии фактора 3. а также Дата1 больше. чем Дата2
10 Количество всего строк


Надо так
c v
Ошибка 1. Отсутствии фактора 12
Ошибка 2. Одновременное отсутствии фактора 1 и фактора 21
Ошибка 3. Отсутствии фактора 3. а также Дата1 больше. чем Дата21
Количество всего строк10


Но лучше так
Группаc v
Группа1Ошибка 1. Отсутствии фактора 12
Группа1Ошибка 2. Одновременное отсутствии фактора 1 и фактора 21
Группа2Ошибка 3. Отсутствии фактора 3. а также Дата1 больше. чем Дата21
Количество всего строк10


Как возможно это сделать?
22 ноя 18, 09:05    [21740810]     Ответить | Цитировать Сообщить модератору
 Re: Вертикальный вывод результата запроса  [new]
asdor
Member

Откуда: Москва
Сообщений: 468
ferzmikk,
Мне кажется, что легче это все решается на клиенте.
Пишете запрос, который получает 1 запись.
Он легко модернизируется.
А на клиенте, эту запись показываете в каком вам надо виде. Легко. На любом клиенте.
22 ноя 18, 09:33    [21740832]     Ответить | Цитировать Сообщить модератору
 Re: Вертикальный вывод результата запроса  [new]
court
Member

Откуда:
Сообщений: 1956
ferzmikk
felix_ff,

Возвращает такой результат
c v
2 Ошибка 1. Отсутствии фактора 1
1 Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2
1 Ошибка 3. Отсутствии фактора 3. а также Дата1 больше. чем Дата2
10 Количество всего строк


Надо так
c v
Ошибка 1. Отсутствии фактора 12
Ошибка 2. Одновременное отсутствии фактора 1 и фактора 21
Ошибка 3. Отсутствии фактора 3. а также Дата1 больше. чем Дата21
Количество всего строк10
ээээ .... ТС, ты реально настолько туп ... "не владеешь предметом", что не можешь перечислить поля вывода в нужном тебе порядке, и с этим пришёл на форум ?? Картинка с другого сайта.
22 ноя 18, 10:33    [21740896]     Ответить | Цитировать Сообщить модератору
 Re: Вертикальный вывод результата запроса  [new]
ferzmikk
Member

Откуда:
Сообщений: 2031
Стормознул) Получилось так.

+SQL-запрос
DECLARE @Таблица table (
	[Фактор1] int,
	[Фактор2] int,	
	[Клиент] nvarchar(10)
);

INSERT INTO
  @Таблица
VALUES 
(1,1,'Клиент1'),
(1,1,'Клиент1'),
(1,1,'Клиент1'),
(1,0,'Клиент2'),
(1,1,'Клиент2'),
(1,1,'Клиент2'),
(1,1,'Клиент3'),
(0,0,'Клиент3'),
(0,1,'Клиент3')

SELECT [Тип ошибки],[Количество] FROM (
	SELECT
		SUM(CASE WHEN 
				[Фактор1] <> 1 
			THEN 1 ELSE 0 END) AS [Ошибка 1. Отсутствии фактора 1],
		SUM(CASE WHEN
				[Фактор1] <> 1 AND [Фактор2] <> 1 
			THEN 1 ELSE 0 END) AS [Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2],		
		Count(*) AS [Количество всего строк]
	FROM
		 @Таблица) src
UNPIVOT
	(
	 [Количество] for [Тип ошибки] in  (
			[Ошибка 1. Отсутствии фактора 1],
			[Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2],
			[Количество всего строк]			
		)
	) as unpivot_

Выдает такой результат:
Тип ошибки Количество
Ошибка 1. Отсутствии фактора 1 2
Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2 1
Количество всего строк 9
27 дек 18, 21:32    [21775269]     Ответить | Цитировать Сообщить модератору
 Re: Вертикальный вывод результата запроса  [new]
ferzmikk
Member

Откуда:
Сообщений: 2031
Теперь надо так

Тип ошибки Кол-во. Общее Кол-во. Клиент1 Кол-во. Клиент2 Кол-во. Клиент3
Количество всего строк 93 3 3
Ошибка 1. Отсутствии фактора 1 20 0 2
Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2 10 0 1

Пишу такой запрос
+SQL-Запрос
SELECT
	[Тип ошибки],
	--[Количество] AS [Кол-во. Общее],
	[Клиент1] AS [Кол-во. Клиент1],
	[Клиент2] AS [Кол-во. Клиент2],
	[Клиент3] AS [Кол-во. Клиент3]
FROM
	(SELECT
		[Тип ошибки],
		[Количество],
		[Клиент]
	FROM (
		SELECT
			[Клиент],
			SUM(CASE WHEN 
					[Фактор1] <> 1  
				THEN 1 ELSE 0 END) AS [Ошибка 1. Отсутствии фактора 1],
			SUM(CASE WHEN
					[Фактор1] <> 1 AND [Фактор2] <> 1 
				THEN 1 ELSE 0 END) AS [Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2],		
			Count(*) AS [Количество всего строк]
		FROM
			 @Таблица
		GROUP BY
			[Клиент]) src
	UNPIVOT
		(
		 [Количество] for [Тип ошибки] in  (
				[Ошибка 1. Отсутствии фактора 1],
				[Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2],
				[Количество всего строк]			
			)
		) as unpivot_) src2
PIVOT
	(SUM([Количество]) for [Клиент] in ([Клиент1],[Клиент2],[Клиент3])
	   ) AS pivot_

Все выводится. Но если снять комментарий у поля [Кол-во. Общее], то пишет ошибку "Недопустимое имя столбца "Количество".".

Почему не видит столбец [Количество], в подзапросе же он есть? Как правильно написать SQL-запрос, чтобы выводилось поле [Кол-во. Общее]. Пока Pivot не динамический.
27 дек 18, 21:36    [21775271]     Ответить | Цитировать Сообщить модератору
 Re: Вертикальный вывод результата запроса  [new]
PizzaPizza
Member

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

Было три фактора и дата. Внезапно появилась размерность клиента без всякого отношения к ранее полученным данным.
Microsoft SQL Server это реляционная база данных, тут должны быть связи между данными.
27 дек 18, 22:39    [21775300]     Ответить | Цитировать Сообщить модератору
 Re: Вертикальный вывод результата запроса  [new]
ferzmikk
Member

Откуда:
Сообщений: 2031
PizzaPizza
Было три фактора и дата. Внезапно появилась размерность клиента без всякого отношения к ранее полученным данным.

Специально убрал лишние поля, чтобы проще воспринималась задача. И добавил поле "Клиент", чтобы еще смотреть в разрезе по клиентам.
28 дек 18, 12:38    [21775641]     Ответить | Цитировать Сообщить модератору
 Re: Вертикальный вывод результата запроса  [new]
ferzmikk
Member

Откуда:
Сообщений: 2031
Такой подзапрос
+SQL-запрос
	(SELECT
		[Тип ошибки],
		[Количество],
		[Клиент]
	FROM (
		SELECT
			[Клиент],
			SUM(CASE WHEN 
					[Фактор1] <> 1 
				THEN 1 ELSE 0 END) AS [Ошибка 1. Отсутствии фактора 1],
			SUM(CASE WHEN
					[Фактор1] <> 1 
					AND
					[Фактор2] <> 1 
				THEN 1 ELSE 0 END) AS [Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2],		
			Count(*) AS [Количество всего строк]
		FROM
			 @Таблица
		GROUP BY
			[Клиент]) src
	UNPIVOT
		(
		 [Количество] for [Тип ошибки] in  (
				[Ошибка 1. Отсутствии фактора 1],
				[Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2],
				[Количество всего строк]			
			)
		) as unpivot_)
Возвращает такой результат:
Тип ошибки Количество Клиент
Ошибка 1. Отсутствии фактора 1 0 Клиент1
Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2 0 Клиент1
Количество всего строк 3 Клиент1
Ошибка 1. Отсутствии фактора 1 0 Клиент2
Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2 0 Клиент2
Количество всего строк 3 Клиент2
Ошибка 1. Отсутствии фактора 1 2 Клиент3
Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2 1 Клиент3
Количество всего строк 3 Клиент3


Почему следующий запрос верхнего уровня не видит столбец [Количество], вернее пишет недопустимое имя столбца?
SELECT
	[Тип ошибки],
	[Количество] AS [Кол-во. Общее],
	[Клиент1] AS [Кол-во. Клиент1],
	[Клиент2] AS [Кол-во. Клиент2],
	[Клиент3] AS [Кол-во. Клиент3]
FROM
	... src2
PIVOT
	(SUM([Количество]) for [Клиент] in ([Клиент1],[Клиент2],[Клиент3])
	   ) AS pivot_
28 дек 18, 12:48    [21775649]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить