suneel kumar gupta Ответов: 3

Sql-запрос для преобразования строк в столбец ниже нужного мне формата данных.


У меня есть данные в следующем формате --


CompanyId	ParamKey	        ParamValue
ABC	        MinLength	           8
ABC	        MaxLength	           0
ABC	        IsAlphanumeric	           1
ABC	        IsCaseSensitive	           0
ABC	        IsSpecialChars	           0
ABC	        PasswordExpiryDays	  80
ABC	        AlertDays	          10



Требуемый Результат Такой-
CompanyId MinLength MaxLength IsAlphanumeric IsCaseSensitive IsSpecialChars PasswordExpiryDays	AlertDays
  ABC	8	0	1	0	0	80	10


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

Я пробовал использовать pivot, но не могу получить требуемый результат. пожалуйста помочь.

Animesh Datta

предоставьте свой сводный запрос sql, чтобы мы могли найти вашу ошибку.

Tomas Takac

Вы должны поместить свой SQL-код в поле" что я пробовал". Воспользуйся Улучшить вопрос сделать это.

3 Ответов

Рейтинг:
25

RAMASWAMY EKAMBARAM

Я предполагаю следующую структуру таблицы (в частности, что столбец paramvalue >= 0)
и предоставление следующего запроса:
Стол:

<pre>
create table companyvalues
(
companyid           varchar(5),
paramkey            varchar(30),
paramvalue          integer,
constraint pk_companyvalues primary key(companyid, paramkey),
constraint ck_paramvalue check(paramvalue >= 0)
);


with companynames as
(
select distinct companyid compid
from companyvalues
) ,
details as
(
select * from companyvalues
) 
select compid, max(MinLength) MinLength, max(MaxLength) MaxLength, max(IsAlphanumeric) IsAlphanumeric, 
max(IsCaseSensitive) IsCaseSensitive, max(IsSpecialChars) IsSpecialChars, max(PasswordExpiryDays) PasswordExpiryDays,
max(AlertDays) AlertDays
from
(
select compid 
		, case when  paramkey = 'MinLength'          then paramvalue else -1 end  MinLength         	
		, case when  paramkey = 'MaxLength'          then paramvalue else -1 end  MaxLength         	
		, case when  paramkey = 'IsAlphanumeric'     then paramvalue else -1 end  IsAlphanumeric    
		, case when  paramkey = 'IsCaseSensitive'    then paramvalue else -1 end  IsCaseSensitive   
		, case when  paramkey = 'IsSpecialChars'     then paramvalue else -1 end  IsSpecialChars    
		, case when  paramkey = 'PasswordExpiryDays' then paramvalue else -1 end  PasswordExpiryDays
		, case when  paramkey = 'AlertDays'          then paramvalue else -1 end  AlertDays         
from companynames, details
where compid = companyid
) finalresult
group by compid
order by 1


Рейтинг:
16

Bryian Tan

Вы действительно пробовали использовать PIVOT? Вот рабочий пример.

DECLARE @cp2 TABLE (
Companyid	VARCHAR(50),
ParamKey	VARCHAR(50),
ParamValue	INT
)

INSERT @cp2 ([CompanyId], [ParamKey], [ParamValue]) VALUES (N'ABC', N'MinLength', 8)
INSERT @cp2 ([CompanyId], [ParamKey], [ParamValue]) VALUES (N'ABC', N'MaxLength', 0)
INSERT @cp2 ([CompanyId], [ParamKey], [ParamValue]) VALUES (N'ABC', N'IsAlphanumeric', 1)
INSERT @cp2 ([CompanyId], [ParamKey], [ParamValue]) VALUES (N'ABC', N'IsCaseSensitive', 0)
INSERT @cp2 ([CompanyId], [ParamKey], [ParamValue]) VALUES (N'ABC', N'IsSpecialChars', 0)
INSERT @cp2 ([CompanyId], [ParamKey], [ParamValue]) VALUES (N'ABC', N'PasswordExpiryDays', 80)
INSERT @cp2 ([CompanyId], [ParamKey], [ParamValue]) VALUES (N'ABC', N'AlertDays', 10)
INSERT @cp2 ([CompanyId], [ParamKey], [ParamValue]) VALUES (N'XYZ', N'MinLength', 7)
INSERT @cp2 ([CompanyId], [ParamKey], [ParamValue]) VALUES (N'XYZ', N'MaxLength', 1)
INSERT @cp2 ([CompanyId], [ParamKey], [ParamValue]) VALUES (N'XYZ', N'IsAlphanumeric', 3)
INSERT @cp2 ([CompanyId], [ParamKey], [ParamValue]) VALUES (N'XYZ', N'IsCaseSensitive', 1)
INSERT @cp2 ([CompanyId], [ParamKey], [ParamValue]) VALUES (N'XYZ', N'IsSpecialChars', 1)
INSERT @cp2 ([CompanyId], [ParamKey], [ParamValue]) VALUES (N'XYZ', N'PasswordExpiryDays', 90)
INSERT @cp2 ([CompanyId], [ParamKey], [ParamValue]) VALUES (N'XYZ', N'AlertDays', 5)

SELECT Companyid, MinLength, [MaxLength], IsAlphanumeric, IsCaseSensitive, IsSpecialChars,
PasswordExpiryDays,AlertDays
FROM (
SELECT Companyid, ParamKey, ParamValue
FROM @cp2) up
PIVOT (MAX(ParamValue) FOR ParamKey IN (MinLength, [MaxLength], IsAlphanumeric, IsCaseSensitive, IsSpecialChars,
PasswordExpiryDays,AlertDays)) AS pvt
ORDER BY Companyid
GO

Выход:
Companyid	MinLength	MaxLength	IsAlphanumeric	IsCaseSensitive	IsSpecialChars	PasswordExpiryDays	AlertDays
ABC	8	0	1	0	0	80	10
XYZ	7	1	3	1	1	90	5


Рейтинг:
1

Patrice T

Цитата:
Я пробовал использовать pivot

SQL Pivot - это то, что вам нужно.
Цитата:
но не может получить требуемого результата.

Это не информативно, констатируйте, что результат не тот, что вы хотите.
Показать запрос и фактический результат.

PIVOT и UNPIVOT в Sql Server | SqlHints.com[^]
Простой способ использования Pivot в SQL-запросе[^]
Преобразование строк в столбцы с помощью "Pivot" в SQL Server-Stack Overflow[^]