Raj 0203 Ответов: 3

Нужен запрос select, чтобы получить вывод, как показано ниже.?


У меня есть таблица SQL (образец) , как показано ниже,
| Loc |   Date     | Id| Sts|
-----------------------------
| Hyd | 15-01-2016 | 1 | A |

| Vjd | 16-01-2016 | 2 | B |

| Viz | 15-01-2016 | 3 | C |

| Hyd | 15-03-2016 | 4 | A |

| Vjd | 15-03-2016 | 5 | B |

| Viz | 15-03-2016 | 6 | C |

| Hyd | 15-03-2016 | 4 | A |

| Vjd | 15-05-2016 | 5 | B |

| Viz | 15-05-2016 | 6 | C |

And i need output like,

| Loc | Jan-16 | Mar-16 | May-16 |
|     |A |B |C |A |B |C |A |B |C |
-------------------------------------
| Hyd |1 |0 |0 |2 |0 |0 |0 |0 |0 |
| Vjd |0 |1 |0 |0 |1 |0 |0 |1 |0 |
| Viz |0 |0 |1 |0 |0 |1 |0 |0 |1 |


Кто-нибудь может мне помочь, пожалуйста..

заранее спасибо.

Что я уже пробовал:

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
	 DECLARE @ColumnName AS NVARCHAR(MAX)
	 --Get distinct values of the PIVOT Column
	 SELECT @ColumnName= ISNULL(@ColumnName + ',','')
	 + QUOTENAME([Date]) 
	 FROM (SELECT  DISTINCT  [Date] FROM [Sample]) AS [Date]  order by [Date] 

	 --print @ColumnName
	 --Prepare the PIVOT query using the dynamic
	 SET @DynamicPivotQuery =
	 N'SELECT [Loc], ' + @ColumnName + ' 
	 FROM [Sample]
	 PIVOT(SUM(Count(*))
	 FOR [Date] IN (' + @ColumnName + ')) AS PVTTable'
	 --Execute the Dynamic Pivot Query
	 EXEC sp_executesql @DynamicPivotQuery

Maciej Los

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

3 Ответов

Рейтинг:
2

Maciej Los

Радж 0203[^] написал в комментарии к решению №1:
Пожалуйста, перепроверьте мой вывод, так как он имел две строки заголовка ,


Как я уже упоминал в комментарии к этому вопросу, вы не можете достичь этого только с помощью T-SQL. Вам нужны инструменты отчетности, такие как Элемент управления reportviewer[^], CrystalReports[^], прием.

Используя только T-SQL, вы можете получить результирующий набор с одним заголовком, т. е.:
| Loc | sts    | Jan-16 | Mar-16 | May-16 |
-------------------------------------
| Hyd | A      |    1   |    0   |    0   |
| Hyd | B      |    2   |    0   |    0   |
| Vjd | A      |    0   |    1   |    0   |
| Vjd | B      |    0   |    1   |    0   |
| Viz | A      |    0   |    0   |    1   |
| Viz | B      |    0   |    0   |    1   |


или
| Loc |   Date  | A | B | C |
-----------------------------
| Hyd | Jan-16  | 1 | 0 | 0 |
| Hyd | Mar-16  | 0 | 0 | 0 |
| Hyd | May-16  | 1 | 2 | 1 |


или смешанный контент вроде:
| Loc | Jan-16_A | Jan-16_B | Jan-16_C | Mar-16_A | Mar-16_B | Mar_16_C | ... and so on...
-------------------------------------------------------------------------------
| Hyd |   1      |    0     |    0     |    2     |    0     |    0     | ...
| Vjd | ..
| Viz | ...

но я не рекомендую использовать такую точку зрения из-за проблем с производительностью.

[РЕДАКТИРОВАТЬ]
По вашему желанию...

SET DATEFORMAT dmy; --needed at my sql server

CREATE TABLE #tmp
(
	Loc VARCHAR(5),
	[Date] Date,
	Id INT,
	Sts VARCHAR(5)
);

INSERT INTO #tmp (Loc, [Date],Id, Sts)
VALUES ('Hyd', '15-01-2016', '1', 'A'),
('Vjd', '16-01-2016', 2, 'B'),
('Viz', '15-01-2016', 3, 'C'),
('Hyd', '15-03-2016', 4, 'A'),
('Vjd', '15-03-2016', 5, 'B'),
('Viz', '15-03-2016', 6, 'C'),
('Hyd', '15-03-2016', 4, 'A'),
('Vjd', '15-05-2016', 5, 'B'),
('Viz', '15-05-2016', 6, 'C')

DECLARE @ColumnName AS NVARCHAR(MAX)

SELECT @ColumnName = ISNULL(@ColumnName + ', ','') + QUOTENAME(Header) 
FROM (
	SELECT t3.PoT + '_' + t3.Sts AS Header
	FROM (
		SELECT DISTINCT CONVERT(VARCHAR(3), DATENAME(M, t1.[Date])) + '-' + CONVERT(VARCHAR(2), DATENAME(Y, t1.[Date])) AS PoT, t2.Sts 
		FROM #tmp AS t1, (
			SELECT DISTINCT Sts AS Sts
			FROM #tmp
			) AS t2  
		) AS t3
	) AS combined

--SELECT @ColumnName 

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX) = N''

SET @DynamicPivotQuery = N' SELECT Loc, ' + @ColumnName  + '
 FROM ( 
	SELECT Loc, CONVERT(VARCHAR(3), DATENAME(M, [Date])) + ''-'' + CONVERT(VARCHAR(2), DATENAME(Y, [Date])) + ''_'' + Sts AS PoT, 1 AS ToT
	FROM #tmp 
	) AS DT 
 PIVOT(SUM(ToT) FOR PoT IN (' + @ColumnName + ')) AS PT'

EXECUTE SP_EXECUTESQL @DynamicPivotQuery

DROP TABLE #tmp


Результат:
Loc	Jan-15_A	Jan-15_B	Jan-15_C	Jan-16_A	Jan-16_B	Jan-16_C	Mar-75_A	Mar-75_B	Mar-75_C	May-13_A	May-13_B	May-13_C
Hyd	1	NULL	NULL	NULL	NULL	NULL	2	NULL	NULL	NULL	NULL	NULL
Viz	NULL	NULL	1	NULL	NULL	NULL	NULL	NULL	1	NULL	NULL	1
Vjd	NULL	NULL	NULL	NULL	1	NULL	NULL	1	NULL	NULL	1	NULL


Moses Lebotsa

Привет

Я не знаю способа, чтобы у вас было два заголовка. Обходной путь будет заключаться в том, чтобы вернуть первую строку с первым столбцом, в первой строке которого есть пустая строка.

Maciej Los

Я уже говорил, что T-SQL позволяет создавать 2 строки заголовка? Нет. Пожалуйста, прочтите мой ответ еще раз.

Raj 0203

@Мачей Лос,
можете ли вы сказать мне, как получить такой результат,
| Места | январь-16_A | январь-16_B | январь-16_C | марта-16_A | марта-16_B | Mar_16_C |
-------------------------------------------------------------------------------
| Hyd| 1 | 0 | 0 | 2 | 0 | 0 | ...
| Эдо | ..

Maciej Los

Почему? Я уже упоминал, что такой запрос не рекомендуется из-за производительности.
Вы должны объединить sts и date поля с помощью перекрестного соединения создают такие заголовки.

Raj 0203

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

Maciej Los

- Готово! Смотрите мой ответ после обновления.

Рейтинг:
2
Рейтинг:
0

Moses Lebotsa

Привет, Радж. Сводные таблицы можно использовать для преобразования результатов столбцов в заголовки столбцов. Пожалуйста, найдите ясный, быстрый и короткий пример по следующему адресу ссылка.

Пожалуйста, обратите внимание, что вам нужно будет вернуть свои даты и месяц-год в соответствии с вашими результатами.

Надеюсь, это вам поможет. овации


Raj 0203

Именно так я и пытался, но не получил точного результата, как требовалось. Пожалуйста, перепроверьте мой вывод, так как он имел две строки заголовка ,
1. / Loc | Jan-16 | Mar-16 | May-16 / and
2.| |А |Б |В |А |В |С |А |В |С |
Вторая строка подобна подзаголовку для первого столбца заголовка.

Пожалуйста, помогите.