别名表实际上是一个透视表吗?

时间:2015-10-21 21:06:15

标签: sql tsql sql-server-2005

我有这个问题:

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将创建两行,我不想要。

我认为我将表格转换为别名会这样做,但我不知道如何创建这样的别名。

有什么想法吗?

2 个答案:

答案 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

这为您提供了与条件聚合查询几乎相同的执行计划,但并不像眼睛那么容易。

SQL Fiddle