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
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。电话号 ;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。电话号=
每个
客户的电话号码将始终为四个
无兄弟。它可以是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
;