Sql server SQL Server:根据记录中的其他字段添加参考号

Sql server SQL Server:根据记录中的其他字段添加参考号,sql-server,Sql Server,我想问一个SQL问题(我目前正在使用SQLServerManagementStudio) 对于结果,将根据customerId和product ID在另一列中添加参考号。(对于相同的customer ID,如果product ID不同,则参考号将增加) 我不知道如何通过比较productid来添加参考号 提前感谢您使用: rextester演示: 返回: +------------+-----------+-------------+-------+ | customerid | product

我想问一个SQL问题(我目前正在使用SQLServerManagementStudio)

对于结果,将根据customerId和product ID在另一列中添加参考号。(对于相同的customer ID,如果product ID不同,则参考号将增加)

我不知道如何通过比较productid来添加参考号

提前感谢您

使用:

rextester演示:

返回:

+------------+-----------+-------------+-------+
| customerid | productid | productname |  ref  |
+------------+-----------+-------------+-------+
|        111 |      6577 | ProductA    | 111-1 |
|        111 |      6123 | ProductB    | 111-2 |
|        111 |      1133 | ProductC    | 111-3 |
|        111 |      1133 | ProductC    | 111-3 |
|        222 |      6577 | ProductA    | 222-1 |
|        222 |      6577 | ProductA    | 222-1 |
|        222 |      1578 | ProductL    | 222-2 |
|        333 |      9273 | ProductX    | 333-1 |
+------------+-----------+-------------+-------+
试试这个

DECLARE @sampledata AS TABLE 
(
CustomerID int,      
ProductID  int
)

INSERT INTO @sampledata VALUES (111, 6577),(111,6123  ),(111,1133 ),(111 ,1133)

SELECT *, 
       CONCAT(s.CustomerID,'-',CAST(dense_rank() over(PARTITION BY s.CustomerID ORDER BY s.ProductID DESC) AS varchar(10))) AS ref
FROM @sampledata s
可以使用稠密的_rank()函数

您的桌子:

create table #yourCustomer (CustomerId int, ProductId int, ProductName varchar(20))

insert into #yourCustomer (CustomerId, ProductId, ProductName) values
 (111      ,        6577      ,'ProductA')
,(111      ,        6123      ,'ProductB')       
,(111      ,        1133      ,'ProductC')  
,(111      ,        1133      ,'ProductC')    
,(222      ,        6577      ,'ProductA')    
,(222      ,        6577      ,'ProductA')    
,(222      ,        1578      ,'ProductL')    
,(333      ,        9273      ,'ProductX') 

密集等级的答案都非常好,并且提供了您所要求的内容

但是有一种潜在的香蕉皮;如果您在将来的某个时候引入新产品,然后重新运行
Ref
逻辑,您将得到不同的结果

如果<代码> REF 的格式没有关系,考虑连接<代码> CustomerId < /代码>和<代码>产品> <代码>。示例:111-1变为111-6577。222-2变为222-1578

如果格式很重要,请考虑创建一个产品表(<代码> Product Tys<代码>,<代码> Product NoD> <代码>,<代码> Product Trime<代码>。code>Ref将等于

CustomerId
+
-
+
ProductRef
。例如:

ProductId   ProductName     ProductRef 
6577        ProductA        1
6123        ProductB        2
1133        ProductC        3
DECLARE @sampledata AS TABLE 
(
CustomerID int,      
ProductID  int
)

INSERT INTO @sampledata VALUES (111, 6577),(111,6123  ),(111,1133 ),(111 ,1133)

SELECT *, 
       CONCAT(s.CustomerID,'-',CAST(dense_rank() over(PARTITION BY s.CustomerID ORDER BY s.ProductID DESC) AS varchar(10))) AS ref
FROM @sampledata s
select *, concat(customerId, '-', dense_rank() over(partition by Customerid order by ProductName)) from #yourCustomer
create table #yourCustomer (CustomerId int, ProductId int, ProductName varchar(20))

insert into #yourCustomer (CustomerId, ProductId, ProductName) values
 (111      ,        6577      ,'ProductA')
,(111      ,        6123      ,'ProductB')       
,(111      ,        1133      ,'ProductC')  
,(111      ,        1133      ,'ProductC')    
,(222      ,        6577      ,'ProductA')    
,(222      ,        6577      ,'ProductA')    
,(222      ,        1578      ,'ProductL')    
,(333      ,        9273      ,'ProductX') 
ProductId   ProductName     ProductRef 
6577        ProductA        1
6123        ProductB        2
1133        ProductC        3