Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2.电话号码:, 电话6=t2。电话号码:, 电话7=t2。电话号码:, 电话8=t2。电话号码:, 电话9=t2。电话号码:, 电话10=t2。电话号码 来自c 左连接t1上的t1.customer\u no=c.customer\u no和t1.tel_Sql Server_Tsql - Fatal编程技术网

Sql server 2.电话号码:, 电话6=t2。电话号码:, 电话7=t2。电话号码:, 电话8=t2。电话号码:, 电话9=t2。电话号码:, 电话10=t2。电话号码 来自c 左连接t1上的t1.customer\u no=c.customer\u no和t1.tel

Sql server 2.电话号码:, 电话6=t2。电话号码:, 电话7=t2。电话号码:, 电话8=t2。电话号码:, 电话9=t2。电话号码:, 电话10=t2。电话号码 来自c 左连接t1上的t1.customer\u no=c.customer\u no和t1.tel,sql-server,tsql,Sql Server,Tsql,2.电话号码:, 电话6=t2。电话号码:, 电话7=t2。电话号码:, 电话8=t2。电话号码:, 电话9=t2。电话号码:, 电话10=t2。电话号码 来自c 左连接t1上的t1.customer\u no=c.customer\u no和t1.telephone\u no=c.telephone\u no 左连接t2上的t2。客户号=c。客户号和t2。电话号=c。电话号 左连接t3上的t3。客户号=c。客户号和t3。电话号=c。电话号 左连接t4上的t4。客户号=c。客户号和t4。电话号=

2.电话号码:, 电话6=t2。电话号码:, 电话7=t2。电话号码:, 电话8=t2。电话号码:, 电话9=t2。电话号码:, 电话10=t2。电话号码 来自c 左连接t1上的t1.customer\u no=c.customer\u no和t1.telephone\u no=c.telephone\u no 左连接t2上的t2。客户号=c。客户号和t2。电话号=c。电话号 左连接t3上的t3。客户号=c。客户号和t3。电话号=c。电话号 左连接t4上的t4。客户号=c。客户号和t4。电话号=c。电话号 左连接t5上的t5。客户号=c。客户号和t5。电话号=c。电话号 左连接t6上的t6。客户号码=c。客户号码和t6。电话号码=c。电话号码 左连接t7上的t7.customer\u no=c.customer\u no和t7.telephone\u no=c.telephone\u no 左连接t8上的t8.customer\u no=c.customer\u no和t8.telephone\u no=c.telephone\u no 左连接t9上的t9。客户号=c。客户号和t9。电话号=c。电话号 左连接t10上的t10。客户号=c。客户号和t10。电话号=c。电话号 ;
每个
客户的电话号码将始终为四个
无兄弟。它可以是n个电话。我有50多万客户。每个都可以有多个电话号码您需要执行
Dynamic Pivot
。您是否有类似于我希望结果集的示例?您正在寻找透视表。在这里搜索
[sql server]行到列
很好的示例-唯一的问题是他说将有10个电话号码字段,因此您希望将计数器硬编码为10,而不是动态获取它。但是预期结果不会显示所有10个电话号码。不管如何,如果最多可以有10个号码,然后我们可以安全地假设他的新表(数据最有可能出现的地方)将有10个电话号码列。他有10个电话号码,我不知道-为什么他不创建一个连接表来存储它们,我也不知道(特别是在经历了这一次混乱之后)。到目前为止,这是最好的答案。很不错的!唯一的问题是,问题说明最多可以有10个电话号码,因此您需要编辑答案以包含所有10个。@StanShaw正在处理动态版本,因此电话号码字段的数量将不会是一个已发布动态版本的问题。然而,这是行不通的,因为他需要一个有10个电话号码的表。@StanShaw刚刚发布了动态版本
Customer_No Name Telephone_No Address   Street_Name Postcode
=========== ==== ============ ========= =========== ========
635532      Mr X 0771111111   FLAT 1000 BEACH ROAD  BN23 5HT
635532      Mr X 0771112222   FLAT 1000 BEACH ROAD  BN23 5HT
635532      Mr X 01903773333  FLAT 1000 BEACH ROAD  BN23 5HT
635532      Mr X 01903774444  FLAT 1000 BEACH ROAD  BN23 5HT
Customer_No Name Telephone_No_1 Telephone_No_2 Telephone_No_3 Telephone_No_4 Address   Street_Name Postcode
=========== ==== ============== ============== ============== ============== ========= =========== ======== 
635532      Mr X 0771111111     0771112222     01903773333    01903774444    FLAT 1000 BEACH ROAD  BN23 5HT
Select DISTINCT
       Customer_No,
       Name,
       ( SELECT MIN(REPLACE(Telephone_No, ' ', '') )
         FROM #PSR_Telephone t2
         WHERE t2.customer_No = t1.Customer_No
           AND LEFT(Telephone_No,2) = '07'
       ) AS [Telephone_No_1] , 
       ( SELECT MAX(REPLACE(Telephone_No, ' ', ''))
         FROM #PSR_Telephone t2
         WHERE t2.customer_No = t1.Customer_No
           AND LEFT(Telephone_No,2) = '07'
      ) AS [Telephone_No_2],
      ( SELECT MIN(REPLACE(Telephone_No, ' ', ''))
        FROM #PSR_Telephone t2
        WHERE t2.customer_No = t1.Customer_No
          AND LEFT(Telephone_No,2) <> '07'
      ) AS [Telephone_No_3],
      ( SELECT MAX(REPLACE(Telephone_No, ' ', ''))
        FROM #PSR_Telephone t2
        WHERE t2.customer_No= t1.Customer_No
          AND LEFT(Telephone_No,2) <> '07'
      ) AS [Telephone_No_4],
      Primary_Addressable_Object,
      Street_Name,
      Postcode
from #PSR_Telephone t1
where Customer_No = '635532'
CREATE TABLE #test
  (
     Customer_No  INT,
     NAME         VARCHAR(50),
     Telephone_No NUMERIC(15),
     Address      VARCHAR(50),
     Street_Name  VARCHAR(50),
     Postcode     VARCHAR(50)
  ) 

insert #test values
(635532 ,'Mr X' ,   0771111111  ,'FLAT 1000' ,  'BEACH ROAD' , 'BN23 5HT'),
(635532 ,'Mr X' ,   0771112222  ,'FLAT 1000' ,  'BEACH ROAD' , 'BN23 5HT'),
(635532 ,'Mr X' ,   01903773333 ,'FLAT 1000' ,  'BEACH ROAD' , 'BN23 5HT'),
(635532 ,'Mr X' ,   01903774444 ,'FLAT 1000' ,  'BEACH ROAD' , 'BN23 5HT'),
(635533 ,'Mr X' ,   01903774444 ,'FLAT 1000' ,  'BEACH ROAD' , 'BN23 5HT')

DECLARE @sql  NVARCHAR(max),
        @cnt  INT,
        @incr INT = 1

SELECT @cnt = (SELECT TOP 1 Count(1) AS cnt
               FROM   #test
               GROUP  BY Customer_No
               ORDER  BY cnt DESC) --To get the max phone number count 

SET @sql = '
;with cte as
(
SELECT Row_number()OVER(partition BY Customer_No ORDER BY Telephone_No) as t_list, 
       *
FROM   #test 
)
select Customer_No,Name,'

WHILE @incr <= @cnt -- used just to frame the query 
  BEGIN
      SET @sql += 'max(case when t_list = '+ Cast(@incr AS VARCHAR(15))+ ' then Telephone_No end) as Telephone_No'
                  + Cast(@incr AS VARCHAR(15)) + ','
      SET @incr+=1
  END

SET @sql+= 'Address ,Street_Name ,Postcode from cte group by Customer_No,Name,Address ,Street_Name ,Postcode'

--PRINT @sql

EXEC Sp_executesql @sql 
╔═════════════╦══════╦════════════════╦════════════════╦════════════════╦════════════════╦═══════════╦═════════════╦══════════╗
║ Customer_No ║ Name ║ Telephone_No_1 ║ Telephone_No_2 ║ Telephone_No_3 ║ Telephone_No_4 ║  Address  ║ Street_Name ║ Postcode ║
╠═════════════╬══════╬════════════════╬════════════════╬════════════════╬════════════════╬═══════════╬═════════════╬══════════╣
║      635532 ║ Mr X ║      771111111 ║ 771112222      ║ 1903773333     ║ 1903774444     ║ FLAT 1000 ║ BEACH ROAD  ║ BN23 5HT ║
║      635533 ║ Mr X ║     1903774444 ║ NULL           ║ NULL           ║ NULL           ║ FLAT 1000 ║ BEACH ROAD  ║ BN23 5HT ║
╚═════════════╩══════╩════════════════╩════════════════╩════════════════╩════════════════╩═══════════╩═════════════╩══════════╝
declare @Table table(
    Customer_No varchar(50), 
    Name varchar(50), 
    Telephone_No varchar(20), 
    Address varchar(50), 
    Street_Name varchar(50), 
    Postcode varchar(50))


insert into @Table
VALUES
(635532, 'Mr. X', '0771111111', 'Flat', '1000 Beach Road', 'Bn23 5HT'),
(635532, 'Mr. X', '0771112222', 'Flat', '1000 Beach Road', 'Bn23 5HT'),
(635532, 'Mr. X', '01903773333', 'Flat', '1000 Beach Road', 'Bn23 5HT')

declare @RowNumberTable table(
    Customer_No varchar(50), 
    Name varchar(50), 
    Telephone_No varchar(50),
    Address varchar(50), 
    Street_Name varchar(50), 
    Postcode varchar(50),
    row_number int)
INSERT INTO @RowNumberTable
SELECT  Customer_No, 
        Name, 
        Telephone_No, 
        Address, 
        Street_Name, 
        Postcode, 
        row_number() over(partition by Customer_No order by Telephone_No) as rn
FROM @Table


SELECT  T1.Customer_No, 
        T1.Name,
        T1.Telephone_No,
        T2.Telephone_No as [Telephone 2],
        T3.Telephone_No as [Telephone 3],
        T4.Telephone_No as [Telephone 4],
        T5.Telephone_No as [Telephone 5],
        T6.Telephone_No as [Telephone 6],
        T7.Telephone_No as [Telephone 7],
        T8.Telephone_No as [Telephone 8],
        T9.Telephone_No as [Telephone 9],
        T10.Telephone_No as [Telephone 10],
        T1.Address,
        T1.Street_Name,
        T1.Postcode
FROM @RowNumberTable T1
LEFT OUTER JOIN @RowNumberTable T2 ON T1.Customer_No = T2.Customer_No AND T2.row_number = 2
LEFT OUTER JOIN @RowNumberTable T3 ON T1.Customer_No = T3.Customer_No AND T3.row_number = 3
LEFT OUTER JOIN @RowNumberTable T4 ON T1.Customer_No = T4.Customer_No AND T4.row_number = 4
LEFT OUTER JOIN @RowNumberTable T5 ON T1.Customer_No = T5.Customer_No AND T5.row_number = 5
LEFT OUTER JOIN @RowNumberTable T6 ON T1.Customer_No = T6.Customer_No AND T6.row_number = 6
LEFT OUTER JOIN @RowNumberTable T7 ON T1.Customer_No = T7.Customer_No AND T7.row_number = 7
LEFT OUTER JOIN @RowNumberTable T8 ON T1.Customer_No = T8.Customer_No AND T8.row_number = 8
LEFT OUTER JOIN @RowNumberTable T9 ON T1.Customer_No = T9.Customer_No AND T9.row_number = 9
LEFT OUTER JOIN @RowNumberTable T10 ON T1.Customer_No = T10.Customer_No AND T10.row_number = 10
WHERE T1.row_number = 1
Customer_No                                        Name                                               Telephone_No                                       Telephone 2                                        Telephone 3                                        Telephone 4                                        Telephone 5                                        Telephone 6                                        Telephone 7                                        Telephone 8                                        Telephone 9                                        Telephone 10                                       Address                                            Street_Name                                        Postcode
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
635532                                             Mr. X                                              01903773333                                        0771111111                                         0771112222                                         NULL                                               NULL                                               NULL                                               NULL                                               NULL                                               NULL                                               NULL                                               Flat                                               1000 Beach Road                                    Bn23 5HT
CREATE TABLE #temp (Customer_No INT, Name  VARCHAR(100),  Telephone_No VARCHAR(100),   Address VARCHAR(100), Street_Name VARCHAR(100), Postcode VARCHAR(100))

INSERT INTO #temp
VALUES
(635532,'Mr X','0771111111','FLAT 1000','BEACH ROAD','BN23 5HT'),          
(635532,'Mr X','0771112222','FLAT 1000','BEACH ROAD','BN23 5HT'),       
(635532,'Mr X','01903773333','FLAT 1000','BEACH ROAD','BN23 5HT'),     
(635532,'Mr X','01903774444' ,'FLAT 1000','BEACH ROAD','BN23 5HT')
;WITH CTE AS (
    SELECT  #temp.Customer_No, 
          #temp.Name,  
          CASE WHEN Row_number()OVER(partition BY Customer_No ORDER BY Telephone_No) = 1 THEN  #temp.Telephone_No END  AS Telephone_No_1, 
          CASE WHEN Row_number()OVER(partition BY Customer_No ORDER BY Telephone_No) = 2 THEN  #temp.Telephone_No END  AS Telephone_No_2, 
          CASE WHEN Row_number()OVER(partition BY Customer_No ORDER BY Telephone_No) = 3 THEN  #temp.Telephone_No END  AS Telephone_No_3, 
          CASE WHEN Row_number()OVER(partition BY Customer_No ORDER BY Telephone_No) = 4 THEN  #temp.Telephone_No END  AS Telephone_No_4, 
          #temp.Address, 
          #temp.Street_Name, 
          #temp.Postcode 
    FROM #temp)

 SELECT  CTE.Customer_No, 
       CTE.Name, 
       MAX(CTE.Telephone_No_1) Telephone_No_1, 
       MAX(CTE.Telephone_No_2) Telephone_No_2, 
       MAX(CTE.Telephone_No_3) Telephone_No_3, 
       MAX(CTE.Telephone_No_4) Telephone_No_4, 
       CTE.Address, 
       CTE.Street_Name, 
       CTE.Postcode
FROM CTE
GROUP BY      CTE.Customer_No, 
          CTE.Name, 
          CTE.Address,
          CTE.Street_Name,
          CTE.Postcode;
IF OBJECT_ID('tempdb..#TEMP') IS NOT NULL
    DROP TABLE #TEMP; 
CREATE TABLE #temp (Customer_No INT, Name  VARCHAR(100),  Telephone_No VARCHAR(100),   Address VARCHAR(100), Street_Name VARCHAR(100), Postcode VARCHAR(100))

INSERT INTO #temp
VALUES
(635532,'Mr X','0771111111','FLAT 1000','BEACH ROAD','BN23 5HT'),          
(635532,'Mr X','0771112222','FLAT 1000','BEACH ROAD','BN23 5HT'),       
(635532,'Mr X','01903773333','FLAT 1000','BEACH ROAD','BN23 5HT'),     
(635532,'Mr X','01903774444' ,'FLAT 1000','BEACH ROAD','BN23 5HT')
IF OBJECT_ID('tempdb..#TEMP2') IS NOT NULL
    DROP TABLE #TEMP2; 

    SELECT  #temp.Customer_No, 
          #temp.Name,  
          Row_number()OVER(partition BY Customer_No ORDER BY Telephone_No) AS rn, 
          #temp.Telephone_No, 
          #temp.Address, 
          #temp.Street_Name, 
          #temp.Postcode INTO #temp2
    FROM #temp


DECLARE @SQL1 VARCHAR(max) ='';

SELECT @SQL1 = '
;WITH CTE AS (
    SELECT  #TEMP2.Customer_No, 
          #TEMP2.Name, ' 

SELECT  @SQL1+='CASE WHEN rn ='+CAST(rn AS VARCHAR)+'THEN  #TEMP2.Telephone_No END  AS Telephone_No_'+CAST(rn AS VARCHAR)+',' FROM #temp2

SELECT @SQL1+= '#TEMP2.Address, 
          #TEMP2.Street_Name, 
          #TEMP2.Postcode 
    FROM #TEMP2)

 SELECT  CTE.Customer_No, 
       CTE.Name,'

SELECT @SQL1+='MAX(CTE.Telephone_No_'+CAST(rn AS VARCHAR)+') AS Telephone_No_'+CAST(rn AS VARCHAR)+','FROM #temp2

SELECT @SQL1+='CTE.Address, 
       CTE.Street_Name, 
       CTE.Postcode
FROM CTE
GROUP BY      CTE.Customer_No, 
          CTE.Name, 
          CTE.Address,
          CTE.Street_Name,
          CTE.Postcode;'



 PRINT(@SQL1)

 EXECUTE (@SQL1)
create table dbo.customer
(
  customer_no  int         not null ,
  telephone_no varchar(32) not null ,
  name         varchar(32) not null ,
  address      varchar(32) not null ,
  street_name  varchar(32) not null ,
  postcode     varchar(32) not null ,

  primary key clustered ( customer_no , telephone_no ) ,

)
with t1 as (
  select customer_no  =      c.customer_no    ,
         telephone_no = min( c.telephone_no )
  from dbo.customer c
  group by c.customer_no
) ,
c as (
  select c.*
  from dbo.customer c
  join t1 on t1.customer_no  = c.customer_no
         and t1.telephone_no = c.telephone_no
) ,
t2 as (
  select customer_no  =      c.customer_no    ,
         telephone_no = min( c.telephone_no )
  from dbo.customer c
  join t1           t on t.customer_no  = c.customer_no
                     and t.telephone_no < c.telephone_no
  group by c.customer_no
),
t3 as (
  select customer_no  =      c.customer_no    ,
         telephone_no = min( c.telephone_no )
  from dbo.customer c
  join t2           t on t.customer_no  = c.customer_no
                     and t.telephone_no < c.telephone_no
  group by c.customer_no
),
t4 as (
  select customer_no  =      c.customer_no    ,
         telephone_no = min( c.telephone_no )
  from dbo.customer c
  join t3           t on t.customer_no  = c.customer_no
                     and t.telephone_no < c.telephone_no
  group by c.customer_no
),
t5 as (
  select customer_no  =      c.customer_no    ,
         telephone_no = min( c.telephone_no )
  from dbo.customer c
  join t4           t on t.customer_no  = c.customer_no
                     and t.telephone_no < c.telephone_no
  group by c.customer_no
),
t6 as (
  select customer_no  =      c.customer_no    ,
         telephone_no = min( c.telephone_no )
  from dbo.customer c
  join t5           t on t.customer_no  = c.customer_no
                     and t.telephone_no < c.telephone_no
  group by c.customer_no
),
t7 as (
  select customer_no  =      c.customer_no    ,
         telephone_no = min( c.telephone_no )
  from dbo.customer c
  join t6           t on t.customer_no  = c.customer_no
                     and t.telephone_no < c.telephone_no
  group by c.customer_no
),
t8 as (
  select customer_no  =      c.customer_no    ,
         telephone_no = min( c.telephone_no )
  from dbo.customer c
  join t7           t on t.customer_no  = c.customer_no
                     and t.telephone_no < c.telephone_no
  group by c.customer_no
),
t9 as (
  select customer_no  =      c.customer_no    ,
         telephone_no = min( c.telephone_no )
  from dbo.customer c
  join t8           t on t.customer_no  = c.customer_no
                     and t.telephone_no < c.telephone_no
  group by c.customer_no
),
t10 as (
  select customer_no  =      c.customer_no    ,
         telephone_no = min( c.telephone_no )
  from dbo.customer c
  join t9           t on t.customer_no  = c.customer_no
                     and t.telephone_no < c.telephone_no
  group by c.customer_no
)
select customer_no = c.customer_no ,
       name        = c.name        ,
       addr        = c.address     ,
       street      = c.street_name ,
       postcode    = c.postcode    ,
       tel_1       = t1.telephone_no ,
       tel_2       = t2.telephone_no ,
       tel_3       = t2.telephone_no ,
       tel_4       = t2.telephone_no ,
       tel_5       = t2.telephone_no ,
       tel_6       = t2.telephone_no ,
       tel_7       = t2.telephone_no ,
       tel_8       = t2.telephone_no ,
       tel_9       = t2.telephone_no ,
       tel_10      = t2.telephone_no
from      c
left join t1  on t1.customer_no  = c.customer_no and t1.telephone_no  = c.telephone_no
left join t2  on t2.customer_no  = c.customer_no and t2.telephone_no  = c.telephone_no
left join t3  on t3.customer_no  = c.customer_no and t3.telephone_no  = c.telephone_no
left join t4  on t4.customer_no  = c.customer_no and t4.telephone_no  = c.telephone_no
left join t5  on t5.customer_no  = c.customer_no and t5.telephone_no  = c.telephone_no
left join t6  on t6.customer_no  = c.customer_no and t6.telephone_no  = c.telephone_no
left join t7  on t7.customer_no  = c.customer_no and t7.telephone_no  = c.telephone_no
left join t8  on t8.customer_no  = c.customer_no and t8.telephone_no  = c.telephone_no
left join t9  on t9.customer_no  = c.customer_no and t9.telephone_no  = c.telephone_no
left join t10 on t10.customer_no = c.customer_no and t10.telephone_no = c.telephone_no
;