首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从分表中按列名排序表

从分表中按列名排序表
EN

Stack Overflow用户
提问于 2020-02-20 00:31:37
回答 1查看 32关注 0票数 0

我有两个单独的表,一个是事务表,另一个是包含要生成的报告列表的表。包含报告的表有需要满足的条件和排序顺序。

代码语言:javascript
复制
Transaction

Emp_ID  Amount  Date

1       100     2020-01-01
2       90      2020-01-04
3       85      2020-01-02
4       40      2020-01-07
5       60      2020-01-08
代码语言:javascript
复制
ReportMaster

ReportID    Sorting     Asc_Desc
1           Amount      Desc
2           Date        Asc
3           Amount      Asc

最终报告将显示联盟中每个报告的前2个结果。

代码语言:javascript
复制
ReportID    Emp_ID  Amount  Date        Row_Number
1           1       100     2020-01-01  1
1           2       90      2020-01-04  2
2           1       100     2020-01-01  1
2           3       85      2020-01-02  2
3           4       40      2020-01-07  1
3           5       60      2020-01-08  2

我对此的逻辑已经走到了死胡同。使用带有“排序”值的order子句,它将只返回Amount/Department,而不是相应列中的值。请记住,实际数据集包含20多列和50-60个报告,因此按顺序编写case语句有点单调乏味。

是否需要递归语句?或者,有没有其他方法来实现这一点?

EN

回答 1

Stack Overflow用户

发布于 2020-02-22 04:39:37

尝试下面的sql:

代码语言:javascript
复制
DECLARE @sql NVARCHAR(MAX) = ''
IF OBJECT_ID('tempdb..#ReportTypes') IS NOT NULL DROP TABLE #ReportTypes
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
CREATE TABLE #Results (
ReportID INT,
Emp_ID INT,
Amount DECIMAL(18, 2),
Date DATETIME,
RowNumber INT
)

SELECT ReportId, Sorting, Asc_Desc
INTO #ReportTypes
FROM ReportMaster

WHILE (SELECT COUNT(*) FROM #ReportTypes) > 0
BEGIN
    DECLARE @ReportId INT, @Sorting VARCHAR(50), @Asc_Desc VARCHAR(50)
    SELECT TOP 1 @ReportID = ReportId, @Sorting = Sorting, @Asc_Desc = Asc_Desc FROM #ReportTypes

    SET @sql = @sql + ' INSERT INTO #Results ' 
            + ' SELECT ' + CAST(@ReportId AS VARCHAR) + ' ,Emp_ID, Amount, Date, ROW_NUMBER() OVER(ORDER BY ' + @Sorting + ' ' + @Asc_Desc + ') AS RowNumber FROM [Transactions];'

    DELETE FROM #ReportTypes WHERE ReportId = @ReportId 
END

EXECUTE sp_executesql @sql

SELECT ReportID, Emp_ID, Amount, Date, RowNumber AS [Row_Number]
FROM #Results
WHERE RowNumber <= 2
ORDER BY ReportID, RowNumber
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60305009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档