【问题标题】:How to format the result set of parent child records?如何格式化父子记录的结果集?
【发布时间】:2009-09-03 14:33:59
【问题描述】:

全部,

我有一个来自多个 SQL Server 表的结果集,我需要知道获取所需排序记录的最佳方法是什么。

我有以下记录;一个用户名和模块号作为父记录,然后每个模块都有多个子模块子记录。我遇到的问题是模块记录与每个子模块记录都有关联。因此,我从我的存储过程中得到以下记录:

NAME            Module  Sub-module
Derek Kenney    1       1
Derek Kenney    1       2
Derek Kenney    1       3
Derek Kenney    1       4
Derek Kenney    1       5

我想要的是:

NAME            Module  Sub-module
Derek Kenney    1       1
                        2
                        3
                        4
                        5

我认为我的问题出在我在下面发布的存储过程中。


ALTER PROCEDURE [dbo].[uspGetReportData]

AS
BEGIN
    SELECT first_name, last_name, email, country_id, T_User_Info.user_id, T_Modules_Viewed.module_id as 'modules viewed', T_Modules_Completed.module_id as 'modules completed'
     FROM T_User_Info inner join T_Modules_Viewed on T_User_Info.user_id = T_Modules_Viewed.user_id left outer join T_Modules_Completed
 on T_Modules_Viewed.user_id = T_Modules_Completed.user_id
END

也许在 ADO.NET 中有一种方法可以获得我想要的结果集,但我不知道。任何帮助将不胜感激。

德里克·肯尼

【问题讨论】:

  • 如果我的答案适合你,你可以点击我的答案旁边的复选标记“接受”它。

标签: .net sql-server ado.net sorting


【解决方案1】:

试试这样的:

DECLARE @YourData table (YourName varchar(20), Module char(1), SubModule char(1))

INSERT INTO @YourData VALUES ('Derek Kenney',1,1)
INSERT INTO @YourData VALUES ('Derek Kenney',1,2)
INSERT INTO @YourData VALUES ('Derek Kenney',1,3)
INSERT INTO @YourData VALUES ('Derek Kenney',1,4)
INSERT INTO @YourData VALUES ('Derek Kenney',1,5)
INSERT INTO @YourData VALUES ('Derek Kenney',2,1)
INSERT INTO @YourData VALUES ('Derek Kenney',2,2)
INSERT INTO @YourData VALUES ('Derek Kenney',2,3)
INSERT INTO @YourData VALUES ('Joe Smith'   ,1,1)
INSERT INTO @YourData VALUES ('Joe Smith'   ,2,1)
INSERT INTO @YourData VALUES ('Joe Smith'   ,2,2)


SELECT
    CASE WHEN NameRank=1 /*OR NameModuleRank=1*/ THEN YourName ELSE '' END AS YourName
        ,CASE NameModuleRank WHEN 1 THEN Module ELSE '' END AS Module
        ,SubModule
    FROM (SELECT
              YourName,Module,SubModule
                  ,ROW_NUMBER() OVER(partition by YourName ORDER BY YourName) AS NameRank
                  ,ROW_NUMBER() OVER(partition by YourName,Module ORDER BY YourName,Module) AS NameModuleRank
              FROM @YourData
         ) dt

输出:

YourName             Module SubModule
-------------------- ------ ---------
Derek Kenney         1      1
                            2
                            3
                            4
                            5
                     2      1
                            2
                            3
Joe Smith            1      1
                     2      1
                            2

(11 row(s) affected)

如果需要,您可以取消注释案例中的 OR,以便在模块更改时显示 YourName

【讨论】:

  • 非常感谢KM。我会试试这个。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2017-07-22
  • 2019-03-08
  • 1970-01-01
  • 2020-04-28
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多