Sql server 2008 SQL Server 2008创建将多行提取到多列的视图(joe的电话a/b/c传真)

Sql server 2008 SQL Server 2008创建将多行提取到多列的视图(joe的电话a/b/c传真),sql-server-2008,view,multiple-columns,Sql Server 2008,View,Multiple Columns,Okay数据位于电话表中,电话表中有“所有号码”列、“号码类型”列和“联系人ID”列 我需要把它剥离成一个单独的一行,每个联系人例如 George phone# fax# mobile# altphone# homephone# ext# 我可以查询并让它自己工作,但如果我添加到海量查询中,它会把它搞砸,不知道为什么,所以视图似乎是个不错的选择。代码如下 create view phonebreakn as select TBL_CONTACT.CONTACTID as c

Okay数据位于电话表中,电话表中有“所有号码”列、“号码类型”列和“联系人ID”列

我需要把它剥离成一个单独的一行,每个联系人例如

George phone# fax# mobile# altphone# homephone# ext#
我可以查询并让它自己工作,但如果我添加到海量查询中,它会把它搞砸,不知道为什么,所以视图似乎是个不错的选择。代码如下

create view phonebreakn as
   select 
      TBL_CONTACT.CONTACTID as contactid,
      TBL_CONTACT.LASTNAME as lastname,
      (select tbl_phone.NUMBERVALUE AS 'tphone' 
       where left(tbl_phone.TYPEID,4)='C3AE'),
      (select tbl_phone.NUMBERVALUE AS 'fax' 
       where left(tbl_phone.TYPEID,4)='2870'),
      (select tbl_phone.NUMBERVALUE AS 'mphone' 
       where left(tbl_phone.TYPEID,4)='511D'),
      (select tbl_phone.NUMBERVALUE AS 'aphone' 
       where left(tbl_phone.TYPEID,4)='C795'),
      (select tbl_phone.NUMBERVALUE AS 'hphone' 
       where left(tbl_phone.TYPEID,4)='2B7C'),
      (select tbl_phone.SUFFIX AS 'pext' 
       where left(tbl_phone.TYPEID,4)='C3AE')
   from 
      TBL_CONTACT
   left join 
      TBL_PHONE on TBL_CONTACT.CONTACTID = TBL_PHONE.CONTACTID
   where 
      CATEGORY like '%Customer%' 
错误是

Msg 4511,16级,状态1,程序phonebreakn,第3行
创建视图或函数失败,因为没有为列3指定列名


我将尝试找出如何使用这个愚蠢的界面,使它看起来像我放进去的那样,但目前我正处于困境,需要帮助

您已将列别名应用于内部子查询,而不是在外部级别公开的列名

按照您奇怪的编写方式,解决此问题的方法是将列别名移出

CREATE VIEW phonebreakn
AS
  SELECT TBL_CONTACT.CONTACTID                       AS contactid,
         TBL_CONTACT.LASTNAME                        AS lastname,
         (SELECT tbl_phone.NUMBERVALUE
          WHERE  LEFT(tbl_phone.TYPEID, 4) = 'C3AE') AS tphone,
         (SELECT tbl_phone.NUMBERVALUE
          WHERE  LEFT(tbl_phone.TYPEID, 4) = '2870') AS fax,
         (SELECT tbl_phone.NUMBERVALUE 
          WHERE  LEFT(tbl_phone.TYPEID, 4) = '511D') AS mphone,
         (SELECT tbl_phone.NUMBERVALUE
          WHERE  LEFT(tbl_phone.TYPEID, 4) = 'C795') AS aphone,
         (SELECT tbl_phone.NUMBERVALUE
          WHERE  LEFT(tbl_phone.TYPEID, 4) = '2B7C') AS hphone,
         (SELECT tbl_phone.SUFFIX
          WHERE  LEFT(tbl_phone.TYPEID, 4) = 'C3AE') AS pext
  FROM   TBL_CONTACT
         LEFT JOIN TBL_PHONE
           ON TBL_CONTACT.CONTACTID = TBL_PHONE.CONTACTID
  WHERE  CATEGORY LIKE '%Customer%' 
虽然更容易理解的重写会用到用例

CREATE VIEW phonebreakn
AS
  SELECT TBL_CONTACT.CONTACTID AS contactid,
         TBL_CONTACT.LASTNAME  AS lastname,
         CASE
           WHEN LEFT(tbl_phone.TYPEID, 4) = 'C3AE'
             THEN tbl_phone.NUMBERVALUE
         END                   AS tphone,
         CASE
           WHEN LEFT(tbl_phone.TYPEID, 4) = '2870'
             THEN tbl_phone.NUMBERVALUE
         END                   AS fax,
         CASE
           WHEN LEFT(tbl_phone.TYPEID, 4) = '511D'
             THEN tbl_phone.NUMBERVALUE
         END                   AS mphone,
         CASE
           WHEN LEFT(tbl_phone.TYPEID, 4) = 'C795'
             THEN tbl_phone.NUMBERVALUE
         END                   AS aphone,
         CASE
           WHEN LEFT(tbl_phone.TYPEID, 4) = '2B7C'
             THEN tbl_phone.NUMBERVALUE
         END                   AS hphone,
         CASE
           WHEN LEFT(tbl_phone.TYPEID, 4) = 'C3AE'
             THEN tbl_phone.NUMBERVALUE
         END                   AS pext
  FROM   TBL_CONTACT
         LEFT JOIN TBL_PHONE
           ON TBL_CONTACT.CONTACTID = TBL_PHONE.CONTACTID
  WHERE  CATEGORY LIKE '%Customer%' 
也许您真正需要的是一个交叉表类型的查询

CREATE VIEW phonebreakn
AS
  SELECT TBL_CONTACT.CONTACTID AS contactid,
         TBL_CONTACT.LASTNAME  AS lastname,
         MAX(CASE
               WHEN LEFT(tbl_phone.TYPEID, 4) = 'C3AE'
                 THEN tbl_phone.NUMBERVALUE
             END)              AS tphone,
         MAX(CASE
               WHEN LEFT(tbl_phone.TYPEID, 4) = '2870'
                 THEN tbl_phone.NUMBERVALUE
             END)              AS fax,
         MAX(CASE
               WHEN LEFT(tbl_phone.TYPEID, 4) = '511D'
                 THEN tbl_phone.NUMBERVALUE
             END)              AS mphone,
         MAX(CASE
               WHEN LEFT(tbl_phone.TYPEID, 4) = 'C795'
                 THEN tbl_phone.NUMBERVALUE
             END)              AS aphone,
         MAX(CASE
               WHEN LEFT(tbl_phone.TYPEID, 4) = '2B7C'
                 THEN tbl_phone.NUMBERVALUE
             END)              AS hphone,
         MAX(CASE
               WHEN LEFT(tbl_phone.TYPEID, 4) = 'C3AE'
                 THEN tbl_phone.NUMBERVALUE
             END)              AS pext
  FROM   TBL_CONTACT
         LEFT JOIN TBL_PHONE
           ON TBL_CONTACT.CONTACTID = TBL_PHONE.CONTACTID
  WHERE  CATEGORY LIKE '%Customer%'
  GROUP  BY TBL_CONTACT.CONTACTID,
            TBL_CONTACT.LASTNAME 

您的所有子查询都缺少一个来自子句的
。@marc_s-这可能是有效的,因为它在离开时具有与
大小写相同的语义(tbl_phone.TYPEID,4)='C3AE',然后是tbl_phone.NUMBERVALUE END