查询组摘要,如报告
Query for group summary like report
我有一个 table 如下所示
ID value
---- ------
1 A1
1 A2
1 A3
2 B1
2 B2
2 B3
我需要使用 SQL Server 2000 编写查询,显示如下所示的输出
ID value
---- ------
1 A1
Null A2
Null A3
2 B1
Null B2
Null B3
这种报表样式格式最好在适当的报表应用程序中完成,但也可以在服务器上完成。
如果您使用的是 SQL 服务器版本 >= 2005(您现在确实应该这样做),您可以使用 window 函数来轻松完成此操作,如下所示:
select case when rn = 1 then id else null end as id, value
from (
select *, rn = row_number() over (partition by id order by id, value)
from your_table
) a
但是由于您使用的是没有 row_number
功能的旧版本,我们必须以某种方式模拟它。一种方法是在相关子查询中使用 运行 行计数 - 这应该有效,但效率不是特别高。
select
case when (
select count(*)
from your_table
where value <= t1.value
and ID = t1.ID
) = 1 then ID
else null end as id
, value
from your_table as t1
因为我无法访问旧版本的任何服务器,所以我无法对其进行测试,但我看不出有任何明显的原因表明它不应该工作。
同意最好在表示层完成此操作的共识,但在 SQL 中执行此操作的一种方法是
SELECT fv.ID,
T1.value
FROM Table1 T1
LEFT JOIN (SELECT ID,
MIN([value]) AS FirstVal
FROM Table1
GROUP BY ID) AS fv
ON T1.ID = fv.ID
AND T1.value = fv.FirstVal
ORDER BY T1.ID,
T1.value
我有一个 table 如下所示
ID value
---- ------
1 A1
1 A2
1 A3
2 B1
2 B2
2 B3
我需要使用 SQL Server 2000 编写查询,显示如下所示的输出
ID value
---- ------
1 A1
Null A2
Null A3
2 B1
Null B2
Null B3
这种报表样式格式最好在适当的报表应用程序中完成,但也可以在服务器上完成。
如果您使用的是 SQL 服务器版本 >= 2005(您现在确实应该这样做),您可以使用 window 函数来轻松完成此操作,如下所示:
select case when rn = 1 then id else null end as id, value
from (
select *, rn = row_number() over (partition by id order by id, value)
from your_table
) a
但是由于您使用的是没有 row_number
功能的旧版本,我们必须以某种方式模拟它。一种方法是在相关子查询中使用 运行 行计数 - 这应该有效,但效率不是特别高。
select
case when (
select count(*)
from your_table
where value <= t1.value
and ID = t1.ID
) = 1 then ID
else null end as id
, value
from your_table as t1
因为我无法访问旧版本的任何服务器,所以我无法对其进行测试,但我看不出有任何明显的原因表明它不应该工作。
同意最好在表示层完成此操作的共识,但在 SQL 中执行此操作的一种方法是
SELECT fv.ID,
T1.value
FROM Table1 T1
LEFT JOIN (SELECT ID,
MIN([value]) AS FirstVal
FROM Table1
GROUP BY ID) AS fv
ON T1.ID = fv.ID
AND T1.value = fv.FirstVal
ORDER BY T1.ID,
T1.value