[英]How convert multiple results rows to single row SQL with respective values
我在 SQL DB 中有两个表Users和UserAttributes 。
表具有类似的结构
需要的是
我尝试的查询
Select * from (
Select u.UserId,u.Username,u.UserEmail,ua.objectName,ua.objectValue
from Users u join userAttribute on u.UserId=ua.UserId
where ua.objectName='city' or pv.objectName='phone')) results
PIVOT (count(UserId)
For objectName IN ([city],[phone])) As pivot_table;
电流输出
仍然是双重条目也是因为我不知道城市和电话结果是 0 和 1(布尔值)。
请帮助获得所需的输出。
您可以进行聚合:
select u.UserId, u.username, u.usermemail,
max(case when ua.objectname = 'city' then objvalue end),
max(case when ua.objectname = 'phone' then objvalue end)
from User u join
userAttribute ua
on u.UserId = ua.UserId
group by u.UserId, u.username, u.usermemail;
您可以使用条件聚合从UserAttributes
表中提取值:
SELECT u.userid, u.userName, u.userEmail,
MAX(CASE WHEN ua.objName = 'city' THEN ua.objValue END) AS city,
MAX(CASE WHEN ua.objName = 'phone' THEN ua.objValue END) AS phone,
FROM Users u
JOIN UserAttributes ua ON ua.userid = u.userid
GROUP BY u.userid, u.userName, u.userEmail
要仅旋转两列, join
很方便:
select u.*, uac.objvalue as city, uap.objvalue as phone
from users u left join
userattributes uac
on uac.userid = u.userid and
uac.objname = 'city' left join
userattributes uap
on uap.userid = u.userid and
uap.objname = 'phone';
如果您只需要匹配的行,请添加:
where uac.objvalue is not null or uap.objvalue is not null
如果您有更多列,那么join
和group by
可能是更好的方法:
select u.*, au.*
from users u join
(select ua.userid,
max(case when objname = 'city' then objvalue end) as city,
max(case when objname = 'phone' then objvalue end) as phone
from userattributes ua
group by ua.userid
) ua
on u.userid = ua.userid;
请尝试以下查询。 希望这会有所帮助
DECLARE @Users table(userid int, username varchar(50))
insert into @Users select 1,'Shiv'
insert into @Users select 2,'Ajay'
DECLARE @UserAttr table(userid int,objname varchar(100),objvalue varchar(100))
insert into @UserAttr select 1,'City','Chd'
insert into @UserAttr select 1,'phone','9646XXXX'
insert into @UserAttr select 2,'phone','8985XXXX'
select * FROM
(
select u.userid,u.username,ua.objname,ua.objvalue FROM @Users u
join @UserAttr ua on u.userid = ua.userid
)a pivot (min(a.objvalue) FOR a.objname in ([city],[phone]))p
以下是您可以尝试使用或不使用枢轴的查询。
1. Without Pivot:-
SELECT ur.UserId,ur.UserName,ur.UserEmail,
Max(CASE WHEN ua.objName = 'city' THEN ua.ObjValue END) as city,
Max (CASE WHEN ua.ObjName = 'phone' THEN ua.ObjValue END) as Phone
FROM Users ur
JOIN UserAttribute ua ON ur.UserId = ua.UserId
GROUP BY ur.UserId,ur.UserName,ur.UserEmail
2. With Pivot :-
select * from (select us.UserId,us.UserName,us.UserEmail,ua.ObjName,ua.ObjValue from users us inner join UserAttribute ua on us.UserId=ua.UserId)t pivot
(
max(ObjValue)
For ObjName in ([city],[phone])
) as pivot_table;
Please try this query and let me know the results.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.