我有这个问题:
SELECT
A.USERID
A.NAME
PVT.PHONE 'PROBABLY A CASE STATEMENT ON NULL WILL GO HERE...
PVT.ADDRESS 'ON HERE AS WELL...
FROM
USERS A
'I NEED TO CREATE A PIVOT TABLE HERE WITH THE ALIAS OF 'PVT' ON TABLE 'B'
B内容:
UserID PHONE ADDRESS TYPE
1 444-555-2222 XXXXXXX PHONE
1 XXXXXXX 66 Nowhere NOTADDRESS
如果TYPE =' PHONE'
,我想通过获取B.PHONE在用户手机的同一行。如果TYPE =' ADDRESS'我还想通过获取B.ADDRESS内容在同一行上查看用户的地址。
正如您在上面的表转储中所看到的,我不的记录与用户ID 和 TYPE =' ADDRESS&匹配#39;
所以我需要显示空白或“无地址”。在主要的SELECT中,它将显示手机,但在同一行,空白或没有地址'。
我不想创建一个INNER JOIN,因为如果B中没有匹配的UserID,查询将不会返回表A中该用户的信息。
此外,LEFT JOIN将创建两行,我不想要。
我认为我将表格转换为别名会这样做,但我不知道如何创建这样的别名。
有什么想法吗?
答案 0 :(得分:2)
如何使用条件聚合?
SELECT A.USERID, A.NAME
B.PHONE, B.ADDRESS
FROM USERS A LEFT JOIN
(SELECT UserId, MAX(CASE WHEN TYPE = 'PHONE' THEN PHONE END) as PHONE,
MAX(CASE WHEN TYPE = 'ADDRESS' THEN ADDRESS END) as ADDRESS
FROM B
GROUP BY UserId
) B
ON B.UserId = A.UserId;
答案 1 :(得分:1)
如果您 使用PIVOT,那么您需要子查询中的数据透视图并保持联接
SELECT
A.USERID,
A.NAME,
PVT.PHONE,
PVT.[ADDRESS]
FROM
Users A
LEFT JOIN (SELECT *
FROM
(SELECT
UserID,
[Type],
(CASE [Type] WHEN 'PHONE' THEN PHONE WHEN 'ADDRESS' THEN [Address] END) Info
FROM UserInfo) AS UI
PIVOT (
MAX(Info)
FOR [Type] IN ([PHONE], [ADDRESS])
) P
) PVT ON A.UserID = PVT.UserID
这为您提供了与条件聚合查询几乎相同的执行计划,但并不像眼睛那么容易。