Sql 数行具有完全相同的值,但只有一列返回不同的值;如何获取此值并为此创建另一列?
这里是:我连接了几个表,得到如下结果:Sql 数行具有完全相同的值,但只有一列返回不同的值;如何获取此值并为此创建另一列?,sql,sql-server,tsql,Sql,Sql Server,Tsql,这里是:我连接了几个表,得到如下结果: ContactID Name Title Phone 1234567 John Manager 999999 1234567 John Manager 888888 我想在结果中获得唯一的ContactID,并将另一个电话值输入“Phone2”。(有2个以上,电话3,电话4) 所以我想看到的结果是这样的 ContactID Name Title Phone
ContactID Name Title Phone
1234567 John Manager 999999
1234567 John Manager 888888
我想在结果中获得唯一的ContactID,并将另一个电话值输入“Phone2”。(有2个以上,电话3,电话4)
所以我想看到的结果是这样的
ContactID Name Title Phone Phone2 Phone3 Phone4...
1234567 John Manager 999999 888888 NULL NULL
有什么帮助吗?我尝试使用Pivot,但似乎聚合函数在这种情况下不起作用 您仍然可以使用PIVOT,尽管您必须组成PIVOT列,我使用下面的ROW_NUMBER()函数。我在下面考虑了4个电话号码,只需扩展模式即可,例如,如果您需要满足更多需求,则有2个位置具有
[4]
下面我展示了来自名为“data”的示例表的数据。如果您有一个复杂的查询,您可以使用一个公共表表达式来命名它,即
;with data as (
<your entire complex query that produces the
columns: ContactId, Name, Title, Phone>
)
select ContactID, Name, Title,
[1] as Phone1,
[2] as Phone2,
[3] as Phone3,
[4] as Phone4
from (
select ContactID, Name, Title, Phone,
Row_Number() over (partition by ContactID, Name, Title
order by Phone) RN
from data) p
pivot (max(Phone) for RN in ([1],[2],[3],[4])) v;
查询1:
create table data (
ContactID int,
Name varchar(10),
Title varchar(10),
Phone varchar(20));
insert data values
(1234561, 'Jill', 'Employee', 999991),
(1234562, 'Joel', 'Employee', 999992),
(1234567, 'John', 'Manager', 999999),
(1234567, 'John', 'Manager', 888888);
select ContactID, Name, Title,
[1] as Phone1,
[2] as Phone2,
[3] as Phone3,
[4] as Phone4
from (
select ContactID, Name, Title, Phone,
Row_Number() over (partition by ContactID, Name, Title
order by Phone) RN
from data) p
pivot (max(Phone) for RN in ([1],[2],[3],[4])) v;
| CONTACTID | NAME | TITLE | PHONE1 | PHONE2 | PHONE3 | PHONE4 |
-------------------------------------------------------------------
| 1234561 | Jill | Employee | 999991 | (null) | (null) | (null) |
| 1234562 | Joel | Employee | 999992 | (null) | (null) | (null) |
| 1234567 | John | Manager | 888888 | 999999 | (null) | (null) |
:
create table data (
ContactID int,
Name varchar(10),
Title varchar(10),
Phone varchar(20));
insert data values
(1234561, 'Jill', 'Employee', 999991),
(1234562, 'Joel', 'Employee', 999992),
(1234567, 'John', 'Manager', 999999),
(1234567, 'John', 'Manager', 888888);
select ContactID, Name, Title,
[1] as Phone1,
[2] as Phone2,
[3] as Phone3,
[4] as Phone4
from (
select ContactID, Name, Title, Phone,
Row_Number() over (partition by ContactID, Name, Title
order by Phone) RN
from data) p
pivot (max(Phone) for RN in ([1],[2],[3],[4])) v;
| CONTACTID | NAME | TITLE | PHONE1 | PHONE2 | PHONE3 | PHONE4 |
-------------------------------------------------------------------
| 1234561 | Jill | Employee | 999991 | (null) | (null) | (null) |
| 1234562 | Joel | Employee | 999992 | (null) | (null) | (null) |
| 1234567 | John | Manager | 888888 | 999999 | (null) | (null) |
如果你愿意,你可以把所有的电话号码放在一列中,根据你的情况,这可能对你更有用 First Last Phone John Manager 888888,999999,111111 最后一部电话 约翰经理888888999999111111
格式编辑请参见@chue-Thx。欢迎使用。正如您可能已经注意到的,我所做的只是在每行的开头添加4个空格,以使您的数据更易于阅读。你也可以用密码来做。你只需要4个电话号码吗?或者可以有超过4个?实际上它超过4个,它变成了10..我需要添加更多的列,以便获得唯一的ContactIDThx,以获得您的帮助Richard!这很有效。但事实上,我连接了几个表(内部连接表1、表2、表3和表4)以获得这些结果…(列继续),我应该将pivot语句放在哪里?在内部连接之前还是之后?我还有一个集体条款……谢谢……谢谢你的帮助理查德。谢谢斯科特。这绝对有用。但实际上我想在结果中添加其他列。干杯