【问题标题】:Alias table that's actually a pivoted one?别名表实际上是一个旋转表?
【发布时间】:2016-01-21 00:53:59
【问题描述】:

我有这个问题:

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 内容在同一行上获取用户地址。

正如您在上面的表格转储中看到的,我没有有与 用户 IDTYPE = 'ADDRESS' 匹配的记录

所以我需要在主 SELECT 中显示一个空白或“无地址”,这将显示电话,但在同一行,空白或“无地址”。

我不想创建 INNER JOIN,因为如果 B 中没有匹配的 UserID,查询将不会返回我在表 A 中为该用户提供的信息。

另外,LEFT JOIN 会创建两行,这是我不想要的。

我认为我将数据透视表作为别名会这样做,但我不知道如何创建这样的别名。

有什么想法吗?

【问题讨论】:

    标签: sql tsql sql-server-2005


    【解决方案1】:

    使用条件聚合怎么样?

    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;
    

    【讨论】:

      【解决方案2】:

      如果您使用 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-27
        • 1970-01-01
        • 2010-10-13
        相关资源
        最近更新 更多