Sql server 2008 SQL Server 2008创建将多行提取到多列的视图(joe的电话a/b/c传真)
Okay数据位于电话表中,电话表中有“所有号码”列、“号码类型”列和“联系人ID”列 我需要把它剥离成一个单独的一行,每个联系人例如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
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