Sql server 如何在SQL Server中对几行进行分组?

Sql server 如何在SQL Server中对几行进行分组?,sql-server,database,Sql Server,Database,我有一个疑问: SELECT Table1.ID, Table1.Code1, Table1.Code2, Table1.Details, Table1.IDS, Table2.Name FROM Table1 INNER JOIN Table2 ON Table1.Code1 = Table2.Code1 WHERE Table1.IDS = 1 ORDER BY Table1.Code1, Table1.Code2 这是我

我有一个疑问:

SELECT 
    Table1.ID, Table1.Code1, Table1.Code2, Table1.Details, 
    Table1.IDS, Table2.Name 
FROM 
    Table1 
INNER JOIN 
    Table2 ON Table1.Code1 = Table2.Code1 
WHERE 
    Table1.IDS = 1 
ORDER BY 
    Table1.Code1, Table1.Code2
这是我的查询结果:

ID    Code1   Code2   Details   IDS    Name
1     1001     01       D1       1      N1
2     1001     01       D2       1      N1
3     1001     02       D3       1      N1
4     1001     05       D4       1      N1
5     1002     11       D5       1      N2
6     1002     12       D6       1      N2
7     1005     21       D7       1      N3
8     1005     21       D8       1      N3
但我想要这个结果:

ID    Code1   Code2   Details   IDS    Name
1     1001     01       D1       1      N1
2              01       D2       1
3              02       D3       1
4              05       D4       1
5     1002     11       D5       1      N2
6              12       D6       1
7     1005     21       D7       1      N3
8              21       D8       1

我如何得到这个结果?请帮帮我。非常感谢

在查询中嵌入表示逻辑并不理想。我建议您以编程方式处理查询结果,以便在迭代时检测组何时更改,或者将查询结果转换为嵌套表。后者可以概括为一个可重用的函数。

如果您可以依靠ID列对组(或其他行的组合,如code1、code2)进行排序,那么您可以通过几种不同的方式来完成

如果您的服务器是2012+,则可以使用LAG()窗口函数访问前几行,如果前几行代码1与当前行代码1相同,则将其替换为null(或空字符串,如果这样更适合您)。但是,如果您使用的是<2012的版本,则可以使用自连接来完成

如果可以的话,在客户端(或报告层)处理这种格式可能更好

下面的查询包括两个版本,但我注释掉了self-join内容:

SELECT 
    Table1.ID,

    -- CASE WHEN Table1.Code1 = t1.Code1 THEN NULL ELSE Table1.Code1 END AS Code1,
    CASE WHEN LAG(Table1.Code1) OVER (ORDER BY Table1.ID) = Table1.Code1 THEN NULL ELSE Table1.Code1 END AS Code1,

    Table1.Code2, Table1.Details, Table1.IDS, 

    -- CASE WHEN Table1.Name = t1.Name THEN NULL ELSE Table1.Name END AS Name,
    CASE WHEN LAG(Table2.Name) OVER (ORDER BY Table1.ID) = Table2.Name THEN NULL ELSE Table2.Name END AS Name

FROM 
    Table1 
INNER JOIN 
    Table2 ON Table1.Code1 = Table2.Code1 
-- LEFT JOIN Table1 t1 ON Table1.ID = t1.ID + 1 
WHERE 
    Table1.IDS = 1 
ORDER BY 
    Table1.Code1, Table1.Code2
莫特扎

这是表示/用户界面层需求的明显例子。数据库是为一个特定的目的而建立的,即处理数据并向您展示结果。我强烈建议您使用前端逻辑来实现您的目标。

使用
CTE
中的
ROW\u NUMBER()
子查询,以下是获得预期输出的一种方法:

;WITH q1 as
(
SELECT 
    t1.ID, 
    t1.Code1, 
    t1.Code2,
    t1.Details, 
    t1.IDS, 
    t2.Name,
    ROW_NUMBER() OVER (PARTITION BY t1.Code1 ORDER BY t1.ID) as rn
FROM 
    table1 t1 
INNER JOIN 
    Table2 t2 ON t1.Code1 = t2.Code1 
)

SELECT 
    q1.ID, 
    CASE
      WHEN rn = 1 THEN q1.Code1
    ELSE ''
    END as Code1, --only populate first row for each code1
    q1.Code2,
    q1.Details, 
    q1.IDS, 
    CASE
      WHEN rn = 1 THEN q1.Name
    ELSE ''
    END as Name  --only populate first row for each name
FROM 
    q1
WHERE 
    q1.IDS = 1 
ORDER BY 
    q1.Code1, q1.Code2

ID(表1.ID)是否总是按照您想要的顺序显示结果?不,表1.ID不是什么大问题。我的目标是消除第二栏中的重复。准确地说,我希望在C#中有一个如上所述的打印文档,但我无法创建所需的查询。