Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / PIVOT/UNPIVOT несколько значений из столбца в одну строку / 18 сообщений из 18, страница 1 из 1
06.02.2019, 21:04
    #39770420
Kotovach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
Доброго времени суток! На форумах есть темы с подобным вопросом, где нужно значения из столбца поместить в одну строку в соответствии с каким-то условием. Но мне нужно сделать это через PIVOT/UNPIVOT.

для каждого empid поместить все его company в одну строку

Например:
как есть
...
Рейтинг: 0 / 0
06.02.2019, 21:05
    #39770421
Kotovach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
как должно быть
...
Рейтинг: 0 / 0
06.02.2019, 21:20
    #39770426
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
KotovachНо мне нужно сделать это через PIVOT/UNPIVOT.В общем случае это невозможно.
...
Рейтинг: 0 / 0
06.02.2019, 21:48
    #39770432
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
KotovachНо мне нужно сделать это через PIVOT/UNPIVOT.Только если напишите соответсвующую агрегатную функцию ( https://docs.microsoft.com/ru-ru/sql/relational-databases/user-defined-functions/create-user-defined-aggregates?view=sql-server-2017) с IsInvariantToNulls = true
Со штатной string_agg не взлетит.
...
Рейтинг: 0 / 0
06.02.2019, 21:55
    #39770435
Kotovach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
invm, спасибо за наводку, но такой функционал доступен с 2016 server. В моем случае лицензия на 2012.
...
Рейтинг: 0 / 0
06.02.2019, 22:59
    #39770445
Kotovach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
alexeyvg, все больше думаю, что Вы правы)
написала решение общее
USE tempdb
IF OBJECT_ID('dbo.CONsum', 'P') IS NOT NULL
DROP PROC dbo.CONsum;
GO

CREATE FUNCTION dbo.CONsum(@id INTEGER)
RETURNS NVARCHAR(1000)
AS
BEGIN
DECLARE @Result NVARCHAR(4000)
SET @Result = ''
SELECT @Result = @Result + companyname + ', ' FROM (SELECT companyname, empid
FROM TestSQL.Sales.Orders AS SO
,TestSQL.Sales.Customers AS SC
WHERE SO.custid=SC.custid) AS qqq
WHERE empid = @id;
RETURN '"' + RTRIM(@Result) + '"'
END
GO

но на PIVOT как указано в задании переделать не могу...
...
Рейтинг: 0 / 0
06.02.2019, 23:01
    #39770446
Kotovach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
Весь кода
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
USE tempdb
IF OBJECT_ID('dbo.CONsum', 'P') IS NOT NULL
  DROP PROC dbo.CONsum;
GO

CREATE FUNCTION dbo.CONsum(@id INTEGER)
RETURNS NVARCHAR(1000)
AS
BEGIN
DECLARE @Result NVARCHAR(4000)
SET @Result = ''
SELECT @Result = @Result + companyname + ', ' 
                      FROM (SELECT companyname, empid
FROM TestSQL.Sales.Orders AS SO
															 ,TestSQL.Sales.Customers AS SC
													WHERE SO.custid=SC.custid) AS rez1
												WHERE empid = @id;
RETURN '"' + RTRIM(@Result) + '"'
END
GO

SELECT DISTINCT empid, dbo.CONsum(empid) FROM TestSQL.Sales.Orders
GO
...
Рейтинг: 0 / 0
06.02.2019, 23:24
    #39770449
Kotovach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
не обращайте на мои ранние сообщения внимание)

Код: 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.
USE tempdb
IF OBJECT_ID('dbo.CONsum', 'F') IS NOT NULL
  DROP PROC dbo.CONsum;
GO

CREATE FUNCTION dbo.CONs(@id INTEGER)
RETURNS NVARCHAR(1000)
AS
BEGIN
DECLARE @Result NVARCHAR(4000)
SET @Result = ''
SELECT @Result = @Result + companyname + ', '
                FROM (SELECT distinct companyname, SO.empid
				FROM TestSQL.Sales.Orders AS SO
			                 ,TestSQL.Sales.Customers AS SC
						WHERE SO.custid=SC.custid
			   ) AS qqq
		WHERE empid = @id;
RETURN '"' + RTRIM(@Result) + '"'
END
GO

SELECT DISTINCT empid, dbo.CONs(empid) FROM TestSQL.Sales.Orders
GO
...
Рейтинг: 0 / 0
07.02.2019, 09:39
    #39770513
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
Kotovach,

Покажите оригинальный текст задания.
...
Рейтинг: 0 / 0
07.02.2019, 11:12
    #39770568
Kotovach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
invm,

И задание необходимо выполнять в соответсвии с указаной темой Pivot/Unpivot/DynamicSQL

Show the list of distinct customers who placed orders with each employee. Create two queries one for SQL Server 2017 version and another for older version of SQL Server

далее следуют изображения, раннее уже прикрепленные

Я тоже пришла к выводу, что делать через Pivot это лишнее, обсудили с наставником, пришли к согласию о предыдущем решении=)

Всем спасибо!)
...
Рейтинг: 0 / 0
07.02.2019, 11:42
    #39770584
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
Kotovachобсудили с наставником, пришли к согласию о предыдущем решении=)А ничего, что это решение к задаче "Show the list of distinct customers who placed orders with each employee" вообще никак не относится?
...
Рейтинг: 0 / 0
07.02.2019, 12:44
    #39770611
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
Kotovach,

https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017

Код: sql
1.
2.
3.
4.
SELECT town, 
    STRING_AGG (email, ';') WITHIN GROUP (ORDER BY email ASC) AS emails 
FROM dbo.Employee 
GROUP BY town; 



2017 +
...
Рейтинг: 0 / 0
07.02.2019, 14:57
    #39770704
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
KotovachЯ тоже пришла к выводу, что делать через Pivot это лишнее, обсудили с наставником, пришли к согласию о предыдущем решении=)А, а сначала препод сказал про обязательное использование pivot?
Без него то есть разные способы, например, тут в ФАКе есть несколько ваниантов, допустим, через XML
http://www.sql.ru/faq/faq_topic.aspx?fid=130
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
use tempdb
go
drop table test
go
create table dbo.TEST ([Тип] INTEGER, [Имя] NVARCHAR(100), [Количество] INTEGER)
go
INSERT dbo.TEST VALUES(1, N'Молоко', 5)
INSERT dbo.TEST VALUES(1, N'Сметана', 6)
INSERT dbo.TEST VALUES(2, N'Гвозди', 44)
INSERT dbo.TEST VALUES(3, N'Машины', 1)

select [Тип] ,( select [Имя]+': '+cast([Количество] as nvarchar)+ ',' as 'data()' from test t2 where t1.[Тип]=t2.[Тип] for xml path('') )
from dbo.TEST t1
group by [Тип]
...
Рейтинг: 0 / 0
07.02.2019, 16:22
    #39770740
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
alexeyvg,

А вы в курсе, что это некорректно работает при наличии спецсимволов?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
use tempdb
go
drop table test
go
create table dbo.TEST ([Тип] INTEGER, [Имя] NVARCHAR(100), [Количество] INTEGER)
go
INSERT dbo.TEST VALUES(1, N'Моло<ко', 5)
INSERT dbo.TEST VALUES(1, N'Сметана', 6)
INSERT dbo.TEST VALUES(2, N'Гвоз>ди', 44)
INSERT dbo.TEST VALUES(2, N'М<ашины', 1)

select [Тип] ,( select [Имя]+': '+cast([Количество] as nvarchar)+ ',' as 'data()' from test t2 where t1.[Тип]=t2.[Тип] for xml path('') )
from dbo.TEST t1
group by [Тип]




Код: xml
1.
2.
1	Моло&lt;ко: 5, Сметана: 6,
2	Гвоз&gt;ди: 44, М&lt;ашины: 1,
...
Рейтинг: 0 / 0
07.02.2019, 16:42
    #39770747
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
Код: sql
1.
2.
3.
SELECT [Тип], STUFF((SELECT N', '+[Имя]+N': '+CAST([Количество] AS NVARCHAR) FROM dbo.TEST t2 WHERE t1.[Тип]=t2.[Тип] FOR XML PATH(''),TYPE).value('.','NVARCHAR(100)'),1,2,N'')
FROM dbo.TEST t1
GROUP BY [Тип];
...
Рейтинг: 0 / 0
07.02.2019, 16:57
    #39770751
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
И все упорно продолжают решать исходную задачу агрегированием строк
...
Рейтинг: 0 / 0
07.02.2019, 18:57
    #39770809
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
invmИ все упорно продолжают решать исходную задачу агрегированием строк
Мда, действительно....
Как связанл это:
Kotovachдля каждого empid поместить все его company в одну строку
С этим?
KotovachShow the list of distinct customers who placed orders with each employee.
...
Рейтинг: 0 / 0
08.02.2019, 14:57
    #39771147
Kotovach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PIVOT/UNPIVOT несколько значений из столбца в одну строку
alexeyvg,

потому что не видно всех промежуточных таблиц. Задача не тот исходник, что просили, а интерпритированное условие

всем спасибо
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / PIVOT/UNPIVOT несколько значений из столбца в одну строку / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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