请教:SQL数据库,某个字段需要拆分查询,进行统计

Forever891 2018-05-21 09:44:22
表 T


dh字段 格式为A-B-C-D 不规则的(有三个 ‘ - ‘)

我想查询结果select DH的第一段,第二段,count(第三段),sum(ys),sum(filenum) 得到查询结果

思考了好久写不出来,请教各位,在此谢谢了
...全文
1567 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
OwenZeng_DBA 2018-05-24
  • 打赏
  • 举报
回复
最好的办法是把第一列这个字符串拆分开来存,,
Forever891 2018-05-22
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:

create table test(id int, name varchar(30))
insert into test values
(1,'110-永久2010-0008-001'),(2,'110-永久2010-0008-002'),
(1,'110-永久2010-0008-003'),(2,'110-永久2010-0008-004')

go
 -- 用这个方法拆分,汇总你自己来吧 
SELECT A.id, 
A.name.value('v[1]','varchar(30)') v1,
A.name.value('v[2]','varchar(30)') v2,
A.name.value('v[3]','varchar(30)') v3,
A.name.value('v[4]','varchar(30)') v4

FROM(
    SELECT id, 
    name = CONVERT(xml,'<v>' + REPLACE(name, '-', '</v><v>') + '</v>') 
    FROM test
)A
go
drop table test

引用 2 楼 RINK_1 的回复:

with cte
as
(SELECT parsename(REPLACE(dh,'-','.'),4) as segment_1, 
        parsename(REPLACE(dh,'-','.'),3) as segment_2, 
        parsename(REPLACE(dh,'-','.'),2) as segment_3, 
        parsename(REPLACE(dh,'-','.'),1) as segment_4,
        ys,filenum
 FROM T)
 
select segment_1,segment_2,COUNT(segment_3) as count_3,SUM(ys) as total_ys,SUM(filenum) as total_filenum 
from cte
group by segment_1,segment_2
谢谢 您这个方法 可以实现需求。
吉普赛的歌 2018-05-22
  • 打赏
  • 举报
回复
如果表大, 建议用持久化的计算列, 另外加上索引, 这样效率比较高
RINK_1 2018-05-22
  • 打赏
  • 举报
回复

with cte
as
(SELECT parsename(REPLACE(dh,'-','.'),4) as segment_1, 
        parsename(REPLACE(dh,'-','.'),3) as segment_2, 
        parsename(REPLACE(dh,'-','.'),2) as segment_3, 
        parsename(REPLACE(dh,'-','.'),1) as segment_4,
        ys,filenum
 FROM T)
 
select segment_1,segment_2,COUNT(segment_3) as count_3,SUM(ys) as total_ys,SUM(filenum) as total_filenum 
from cte
group by segment_1,segment_2
卖水果的net 2018-05-21
  • 打赏
  • 举报
回复

create table test(id int, name varchar(30))
insert into test values
(1,'110-永久2010-0008-001'),(2,'110-永久2010-0008-002'),
(1,'110-永久2010-0008-003'),(2,'110-永久2010-0008-004')

go
 -- 用这个方法拆分,汇总你自己来吧 
SELECT A.id, 
A.name.value('v[1]','varchar(30)') v1,
A.name.value('v[2]','varchar(30)') v2,
A.name.value('v[3]','varchar(30)') v3,
A.name.value('v[4]','varchar(30)') v4

FROM(
    SELECT id, 
    name = CONVERT(xml,'<v>' + REPLACE(name, '-', '</v><v>') + '</v>') 
    FROM test
)A
go
drop table test

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧