根据表中列的条件列出表中的数据

时间:2014-02-03 19:50:01

标签: sql pivot

我有桌面客户,其中包含电话号码和电话号码类型。电话号码类型包括家庭,工作和移动的H,W,M。我需要的是列出根据手机类型显示电话号码的记录。例 如果customer1有两个电话记录,我想得到如下列表:

customer PhoneH phoneW PhoneM 
ABC      123    None   232

以下是Cust_tbl中的列:

CustomerId, CustomerName, Phone, PhoneType

2 个答案:

答案 0 :(得分:0)

根据数据库的不同,有不同的解决方案。例如,在Access中的透视是不同的,那么让我们说Oracle。还有一些缺少要求

  1. 如果在查询中添加其他列时会引入新的手机类型会怎样?
  2. 客户是否应该禁止或显示电话号码?
  3. 如果客户有多个给定类型的电话号码应该发生什么?
  4. 如果相同的customerId的客户名称不同(2NF那么多),应该怎么办
  5. 那说这将产生我们从大多数数据库的问题中得知的输出。

    它使用内联视图c创建“唯一”客户列表。然后为每种类型连接3次到cust_tbl。

    SELECT C.customername customer, 
           h.phone        AS PhoneH, 
           w.phone        AS phoneW, 
           m.phone        AS PhoneM 
    FROM   (SELECT DISTINCT customerid, 
                            customername 
            FROM   cust_tbl) AS c 
           LEFT JOIN cust_tbl h 
                  ON c.customerid = h.customerid 
                     AND h.phonetype = 'H' 
           LEFT JOIN cust_tbl w 
                  ON c.customerid = w.customerid 
                     AND w.phonetype = 'W' 
           LEFT JOIN cust_tbl m 
                  ON c.customerid = m.customerid 
                     AND m.phonetype = 'M' 
    

    Demo

    这不会解决#1问题,#2模糊不清,对#3和#4来说有点混乱

    看看凌乱的意思,看看当你得到one bad row here

    时会发生什么

答案 1 :(得分:0)

SQL小提琴:http://sqlfiddle.com/#!3/d41d8/41007

declare @cust_tbl table
(
    CustomerId bigint not null 
    ,CustomerName nvarchar(16) not null
    ,Phone nvarchar(32) not null
    ,PhoneType nchar(1) check(PhoneType in ('H','M','W'))
)

insert @cust_tbl
select 1, 'ABC', '123','H'
union select 1, 'ABC', '232','M'
union select 2, 'XXX', '987','W'

select CustomerName Customer
, coalesce([H],'none') PhoneH
, coalesce([W],'none') PhoneW
, coalesce([M],'none') PhoneM
from @cust_tbl
pivot (
    max(Phone) for phonetype in ([H],[W],[M])
) pvt
order by Customer