在 SQL 的动态查询中排名
Rank in dynamic query in SQL
我正在尝试构建动态查询并基于其中一列创建排名
这是我目前的代码
/*Declare Variable*/
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX),
@PivotColumnNames AS NVARCHAR(MAX),
@PivotSelectColumnNames AS NVARCHAR(MAX),
@Week_Value AS NVARCHAR(MAX),
@Rank AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @PivotColumnNames= ISNULL(@PivotColumnNames + ',','')+ QUOTENAME([W])
FROM (SELECT DISTINCT [W] FROM [Server].[dbo].[Table]) AS cat
ORDER BY [W]
--Get distinct values of the PIVOT Column with isnull
SELECT @PivotSelectColumnNames = ISNULL(@PivotSelectColumnNames + ',','')+ 'ISNULL(' + QUOTENAME([W]) + ', 0) AS '+ QUOTENAME([W])
FROM (SELECT DISTINCT [W] FROM [Server].[dbo].[Table]) AS cat
ORDER BY [W]
--Get current week value
SET @Week_Value = SUBSTRING(@PivotColumnNames,81,15)
--PRINT @Week_Value --Make sure value is correct
--Get the ranking for previews week
SET @Rank = 0 -- this initialize the rank
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery = '
SELECT TOP 200 [L], [Doc_ID], '+@PivotSelectColumnNames+','+@Rank+' AS RNK
FROM
(SELECT [L],
[Doc_ID],
[W],
ISNULL(CAST([PV] AS INT),0) AS [Page_Views]
FROM [Server].[dbo].[Table]
WHERE LEN([Doc_ID]) = 8 OR LEN([Doc_ID]) = 9)Tab1
PIVOT
(
SUM([Page_Views])
FOR [Week] IN ('+@PivotColumnNames+')
) AS Tab2
ORDER BY '+@Week_Value+' DESC'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
所以问题是排名是静态的,我不知道如何在每一行中求和 +1,排名必须根据 @PivotColumnNames 顺序设置,这是我的数据样本到目前为止应用上面的代码
L
Doc_ID
Week 12, 2021
Week 13, 2021
Week 14, 2021
Week 15, 2021
RNK
en
c03722645m
191867
168145
188472
185189
0
fr
c03746609
55908
53467
56678
56028
0
这就是我想要的
L
Doc_ID
Week 12, 2021
Week 13, 2021
Week 14, 2021
Week 15, 2021
RNK
en
c03722645m
191867
168145
188472
185189
1
fr
c03746609
55908
53467
56678
56028
2
如有任何帮助或建议,我们将不胜感激
您好 TSQL 中有多个 Ranking 选项可用。您遇到的问题必须根据您的要求确定所需的排名功能。我将在这个眼周解决方案中使用 RANK() 函数
/*Declare Variable*/
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX),
@PivotColumnNames AS NVARCHAR(MAX),
@PivotSelectColumnNames AS NVARCHAR(MAX),
@RankingSelectColumn AS VARCHAR(MAX), --Create ranking statement (Added)
@Week_Value AS NVARCHAR(MAX),
@Rank AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @PivotColumnNames= ISNULL(@PivotColumnNames + ',','')+ QUOTENAME([W])
FROM (SELECT DISTINCT [W] FROM [Server].[dbo].[Table]) AS cat
ORDER BY [W]
--Make Ranking logic depending on the rank change ASC or DESC
SELECT @RankingSelectColumn = ISNULL(@RankingSelectColumn + ' ASC,','')+ 'ISNULL(' + QUOTENAME([W]) + ', 0) AS '+ QUOTENAME([W])
FROM (SELECT DISTINCT [W] FROM [Server].[dbo].[Table]) AS cat
ORDER BY [W]
--Get distinct values of the PIVOT Column with isnull (Added)
SELECT @PivotSelectColumnNames = ISNULL(@PivotSelectColumnNames + ',','')+ 'ISNULL(' + QUOTENAME([W]) + ', 0) AS '+ QUOTENAME([W])
FROM (SELECT DISTINCT [W] FROM [Server].[dbo].[Table]) AS cat
ORDER BY [W]
--Get current week value
SET @Week_Value = SUBSTRING(@PivotColumnNames,81,15)
--PRINT @Week_Value --Make sure value is correct
--Get the ranking for previews week
SET @Rank = 0 -- this initialize the rank
--Prepare the PIVOT query using the dynamic (Added Rank function)
SET @DynamicPivotQuery = '
SELECT TOP 200 [L], [Doc_ID], '+@PivotSelectColumnNames+',RANK() OVER('+@RankingSelectColumn+') AS RNK
FROM
(SELECT [L],
[Doc_ID],
[W],
ISNULL(CAST([PV] AS INT),0) AS [Page_Views]
FROM [Server].[dbo].[Table]
WHERE LEN([Doc_ID]) = 8 OR LEN([Doc_ID]) = 9)Tab1
PIVOT
(
SUM([Page_Views])
FOR [Week] IN ('+@PivotColumnNames+')
) AS Tab2
ORDER BY '+@Week_Value+' DESC'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
这将根据列逻辑排名
我正在尝试构建动态查询并基于其中一列创建排名 这是我目前的代码
/*Declare Variable*/
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX),
@PivotColumnNames AS NVARCHAR(MAX),
@PivotSelectColumnNames AS NVARCHAR(MAX),
@Week_Value AS NVARCHAR(MAX),
@Rank AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @PivotColumnNames= ISNULL(@PivotColumnNames + ',','')+ QUOTENAME([W])
FROM (SELECT DISTINCT [W] FROM [Server].[dbo].[Table]) AS cat
ORDER BY [W]
--Get distinct values of the PIVOT Column with isnull
SELECT @PivotSelectColumnNames = ISNULL(@PivotSelectColumnNames + ',','')+ 'ISNULL(' + QUOTENAME([W]) + ', 0) AS '+ QUOTENAME([W])
FROM (SELECT DISTINCT [W] FROM [Server].[dbo].[Table]) AS cat
ORDER BY [W]
--Get current week value
SET @Week_Value = SUBSTRING(@PivotColumnNames,81,15)
--PRINT @Week_Value --Make sure value is correct
--Get the ranking for previews week
SET @Rank = 0 -- this initialize the rank
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery = '
SELECT TOP 200 [L], [Doc_ID], '+@PivotSelectColumnNames+','+@Rank+' AS RNK
FROM
(SELECT [L],
[Doc_ID],
[W],
ISNULL(CAST([PV] AS INT),0) AS [Page_Views]
FROM [Server].[dbo].[Table]
WHERE LEN([Doc_ID]) = 8 OR LEN([Doc_ID]) = 9)Tab1
PIVOT
(
SUM([Page_Views])
FOR [Week] IN ('+@PivotColumnNames+')
) AS Tab2
ORDER BY '+@Week_Value+' DESC'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
所以问题是排名是静态的,我不知道如何在每一行中求和 +1,排名必须根据 @PivotColumnNames 顺序设置,这是我的数据样本到目前为止应用上面的代码
L | Doc_ID | Week 12, 2021 | Week 13, 2021 | Week 14, 2021 | Week 15, 2021 | RNK |
---|---|---|---|---|---|---|
en | c03722645m | 191867 | 168145 | 188472 | 185189 | 0 |
fr | c03746609 | 55908 | 53467 | 56678 | 56028 | 0 |
这就是我想要的
L | Doc_ID | Week 12, 2021 | Week 13, 2021 | Week 14, 2021 | Week 15, 2021 | RNK |
---|---|---|---|---|---|---|
en | c03722645m | 191867 | 168145 | 188472 | 185189 | 1 |
fr | c03746609 | 55908 | 53467 | 56678 | 56028 | 2 |
如有任何帮助或建议,我们将不胜感激
您好 TSQL 中有多个 Ranking 选项可用。您遇到的问题必须根据您的要求确定所需的排名功能。我将在这个眼周解决方案中使用 RANK() 函数
/*Declare Variable*/
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX),
@PivotColumnNames AS NVARCHAR(MAX),
@PivotSelectColumnNames AS NVARCHAR(MAX),
@RankingSelectColumn AS VARCHAR(MAX), --Create ranking statement (Added)
@Week_Value AS NVARCHAR(MAX),
@Rank AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @PivotColumnNames= ISNULL(@PivotColumnNames + ',','')+ QUOTENAME([W])
FROM (SELECT DISTINCT [W] FROM [Server].[dbo].[Table]) AS cat
ORDER BY [W]
--Make Ranking logic depending on the rank change ASC or DESC
SELECT @RankingSelectColumn = ISNULL(@RankingSelectColumn + ' ASC,','')+ 'ISNULL(' + QUOTENAME([W]) + ', 0) AS '+ QUOTENAME([W])
FROM (SELECT DISTINCT [W] FROM [Server].[dbo].[Table]) AS cat
ORDER BY [W]
--Get distinct values of the PIVOT Column with isnull (Added)
SELECT @PivotSelectColumnNames = ISNULL(@PivotSelectColumnNames + ',','')+ 'ISNULL(' + QUOTENAME([W]) + ', 0) AS '+ QUOTENAME([W])
FROM (SELECT DISTINCT [W] FROM [Server].[dbo].[Table]) AS cat
ORDER BY [W]
--Get current week value
SET @Week_Value = SUBSTRING(@PivotColumnNames,81,15)
--PRINT @Week_Value --Make sure value is correct
--Get the ranking for previews week
SET @Rank = 0 -- this initialize the rank
--Prepare the PIVOT query using the dynamic (Added Rank function)
SET @DynamicPivotQuery = '
SELECT TOP 200 [L], [Doc_ID], '+@PivotSelectColumnNames+',RANK() OVER('+@RankingSelectColumn+') AS RNK
FROM
(SELECT [L],
[Doc_ID],
[W],
ISNULL(CAST([PV] AS INT),0) AS [Page_Views]
FROM [Server].[dbo].[Table]
WHERE LEN([Doc_ID]) = 8 OR LEN([Doc_ID]) = 9)Tab1
PIVOT
(
SUM([Page_Views])
FOR [Week] IN ('+@PivotColumnNames+')
) AS Tab2
ORDER BY '+@Week_Value+' DESC'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
这将根据列逻辑排名