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#中有一个如上所述的打印文档,但我无法创建所需的查询。