Alias table 这实际上是一个旋转的?
Alias table that's actually a pivoted one?
我有这个查询:
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 来获取用户的 phone
如果 TYPE = 'ADDRESS'.
,我还希望在同一行上通过获取 B.ADDRESS 内容来获取用户地址
正如您在上面的 table 转储中看到的那样,我 没有 有匹配 用户 ID 的记录并且类型 = 'ADDRESS'
所以我需要在主要 SELECT 中显示空白或 'No address',这将显示 phone,但在同一行,空白或 'No address' .
我不想创建 INNER JOIN,因为如果 B 中没有匹配的用户 ID,查询将不会 return 我在 table A 中为该用户提供的信息。
此外,LEFT JOIN 将创建两行,这是我不想要的。
我想我已将 table 转换为别名,但我不知道如何创建这样的别名。
有什么想法吗?
使用条件聚合怎么样?
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;
如果您有使用 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
这为您提供了与条件聚合查询几乎相同的执行计划,但看起来并不那么容易。
我有这个查询:
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 来获取用户的 phone如果 TYPE = 'ADDRESS'.
,我还希望在同一行上通过获取 B.ADDRESS 内容来获取用户地址正如您在上面的 table 转储中看到的那样,我 没有 有匹配 用户 ID 的记录并且类型 = 'ADDRESS'
所以我需要在主要 SELECT 中显示空白或 'No address',这将显示 phone,但在同一行,空白或 'No address' .
我不想创建 INNER JOIN,因为如果 B 中没有匹配的用户 ID,查询将不会 return 我在 table A 中为该用户提供的信息。
此外,LEFT JOIN 将创建两行,这是我不想要的。
我想我已将 table 转换为别名,但我不知道如何创建这样的别名。
有什么想法吗?
使用条件聚合怎么样?
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;
如果您有使用 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
这为您提供了与条件聚合查询几乎相同的执行计划,但看起来并不那么容易。