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