Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вертикальный вывод результата запроса / 12 сообщений из 12, страница 1 из 1
21.11.2018, 15:52
    #39736214
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вертикальный вывод результата запроса
Здравствуйте!

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

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

SQL-запрос1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
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
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
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 дописать запрос так, чтобы выводил вертикально не зависимо от того, какие поля добавляются или удаляются со временем?
...
Рейтинг: 0 / 0
21.11.2018, 17:17
    #39736271
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вертикальный вывод результата запроса
ferzmikk,

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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
...
Рейтинг: 0 / 0
21.11.2018, 17:19
    #39736275
WarAnt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вертикальный вывод результата запроса
ferzmikk'

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

используйте unpivot + dynamic sql
...
Рейтинг: 0 / 0
21.11.2018, 17:55
    #39736322
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вертикальный вывод результата запроса
TDBVertGridEh (Ehlib)
...
Рейтинг: 0 / 0
22.11.2018, 09:05
    #39736553
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вертикальный вывод результата запроса
felix_ff,

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

Надо так
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

Как возможно это сделать?
...
Рейтинг: 0 / 0
22.11.2018, 09:33
    #39736567
asdor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вертикальный вывод результата запроса
ferzmikk,
Мне кажется, что легче это все решается на клиенте.
Пишете запрос, который получает 1 запись.
Он легко модернизируется.
А на клиенте, эту запись показываете в каком вам надо виде. Легко. На любом клиенте.
...
Рейтинг: 0 / 0
22.11.2018, 10:33
    #39736601
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вертикальный вывод результата запроса
ferzmikkfelix_ff,

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

Надо так
c vОшибка 1. Отсутствии фактора 12Ошибка 2. Одновременное отсутствии фактора 1 и фактора 21Ошибка 3. Отсутствии фактора 3. а также Дата1 больше. чем Дата21Количество всего строк10ээээ .... ТС, ты реально настолько туп ... "не владеешь предметом", что не можешь перечислить поля вывода в нужном тебе порядке, и с этим пришёл на форум ??
...
Рейтинг: 0 / 0
27.12.2018, 21:32
    #39754217
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вертикальный вывод результата запроса
Стормознул) Получилось так.

SQL-запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
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
...
Рейтинг: 0 / 0
27.12.2018, 21:36
    #39754219
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вертикальный вывод результата запроса
Теперь надо так

Тип ошибки Кол-во. Общее Кол-во. Клиент1 Кол-во. Клиент2 Кол-во. Клиент3Количество всего строк 93 3 3Ошибка 1. Отсутствии фактора 1 20 0 2Ошибка 2. Одновременное отсутствии фактора 1 и фактора 2 10 0 1
Пишу такой запрос
SQL-Запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
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 не динамический.
...
Рейтинг: 0 / 0
27.12.2018, 22:39
    #39754237
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вертикальный вывод результата запроса
ferzmikk,

Было три фактора и дата. Внезапно появилась размерность клиента без всякого отношения к ранее полученным данным.
Microsoft SQL Server это реляционная база данных, тут должны быть связи между данными.
...
Рейтинг: 0 / 0
28.12.2018, 12:38
    #39754482
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вертикальный вывод результата запроса
PizzaPizzaБыло три фактора и дата. Внезапно появилась размерность клиента без всякого отношения к ранее полученным данным.
Специально убрал лишние поля, чтобы проще воспринималась задача. И добавил поле "Клиент", чтобы еще смотреть в разрезе по клиентам.
...
Рейтинг: 0 / 0
28.12.2018, 12:48
    #39754488
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вертикальный вывод результата запроса
Такой под запрос
SQL-запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
	(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

Почему следующий запрос верхнего уровня не видит столбец [Количество] , вернее пишет недопустимое имя столбца?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT
	[Тип ошибки],
	[Количество] AS [Кол-во. Общее],
	[Клиент1] AS [Кол-во. Клиент1],
	[Клиент2] AS [Кол-во. Клиент2],
	[Клиент3] AS [Кол-во. Клиент3]
FROM
	... src2
PIVOT
	(SUM([Количество]) for [Клиент] in ([Клиент1],[Клиент2],[Клиент3])
	   ) AS pivot_
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вертикальный вывод результата запроса / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]