关于sql server 分组查询

时间:2022-07-18 22:31:27
sql 语句是这样的:
select distinct doc_id,xm,bd
from qd  

效果是:
104-1-a M7.5浆砌片石急流槽 D9
104-1-a 利用土方 D9
104-1-a 清理现场 D9
104-1-a 挖土方 D9
104-1-b 单向土工格栅 D9
104-1-b 砍树挖根 D9
104-1-b 利用石方 D9
104-1-b 挖石方 D9
104-1-c 借土填方 D9
104-1-c 借土填筑 D9
104-1-c 挖除非适用材料(包括淤泥) D9
104-1-c 锥坡填筑 D9
104-1-c-1 Φ40cm复合桩 D9
104-1-c-1 砂砾 D9
207-5-a C15混凝土基底砖砌平台沟(0.4m×0.4m) D9
207-5-a 厚150mm D9
207-5-b C20预制块骨架护坡 D9
207-5-b C25混凝土 D9
我想要的效果是: 
104-1-a M7.5浆砌片石急流槽 D9
  利用土方 D9
  清理现场 D9
  挖土方 D9
104-1-b 单向土工格栅 D9
  砍树挖根 D9
  利用石方 D9
  挖石方 D9
104-1-c 借土填方 D9
  借土填筑 D9
  挖除非适用材料(包括淤泥) D9
  锥坡填筑 D9
104-1-c-1 Φ40cm复合桩 D9
         砂砾 D9
207-5-a C15混凝土基底砖砌平台沟(0.4m×0.4m) D9
        厚150mm D9
207-5-b C20预制块骨架护坡 D9
  C25混凝土 D9
就是说,doc_id相同的情况下,只显示一次,显示在第一条数据那里。
请高手指点!

7 个解决方案

#1


我想要的效果是: 
104-1-a M7.5浆砌片石急流槽 D9 
        利用土方 D9 
        清理现场 D9 
        挖土方 D9 
104-1-b 单向土工格栅 D9 
        砍树挖根 D9 
        利用石方 D9 
        挖石方 D9 
104-1-c 借土填方 D9 
        借土填筑 D9 
        挖除非适用材料(包括淤泥) D9 
        锥坡填筑 D9 
104-1-c-1 Φ40cm复合桩 D9 
        砂砾 D9 
207-5-a C15混凝土基底砖砌平台沟(0.4m×0.4m) D9 
        厚150mm D9 
207-5-b C20预制块骨架护坡 D9 
        C25混凝土 D9 
就是说,doc_id相同的情况下,只显示一次,显示在第一条数据那里。 
请高手指点!

#2


lz应该从应用程序端考虑这个问题

#3


 create table qd (doc_id varchar(20),xm varchar(50),bd varchar(10))
 
insert into qd
  select '104-1-a','M7.5浆砌片石急流槽','D9' 
union all select '104-1-a','利用土方','D9' 
union all select '104-1-a','清理现场','D9' 
union all select '104-1-a','挖土方','D9' 
union all select '104-1-b','单向土工格栅','D9' 
union all select '104-1-b','砍树挖根','D9' 
union all select '104-1-b','利用石方','D9' 
union all select '104-1-b','挖石方','D9' 
union all select '104-1-c','借土填方','D9' 
union all select '104-1-c','借土填筑','D9' 
union all select '104-1-c','挖除非适用材料(包括淤泥)','D9' 
union all select '104-1-c','锥坡填筑','D9' 
union all select '104-1-c-1','Φ40cm复合桩','D9' 
union all select '104-1-c-1','砂砾','D9' 
union all select '207-5-a','C15混凝土基底砖砌平台沟(0.4m×0.4m)','D9' 
union all select '207-5-a','厚150mm','D9' 
union all select '207-5-b','C20预制块骨架护坡','D9' 
union all select '207-5-b','C25混凝土','D9' 

select doc_id=case when (select count(1) from qd where doc_id=a.doc_id and xm<=a.xm)>1 then '' else doc_id end,xm,bd from qd a  


/*
doc_id xm db
-----------------------------------------------------
104-1-a M7.5浆砌片石急流槽 D9
利用土方 D9
清理现场 D9
挖土方 D9
104-1-b 单向土工格栅 D9
砍树挖根 D9
利用石方 D9
挖石方 D9
104-1-c 借土填方 D9
借土填筑 D9
挖除非适用材料(包括淤泥) D9
锥坡填筑 D9
104-1-c-1 Φ40cm复合桩 D9
砂砾 D9
207-5-a C15混凝土基底砖砌平台沟(0.4m×0.4m) D9
厚150mm D9
207-5-b C20预制块骨架护坡 D9
C25混凝土 D9
*/


drop table qd
 

#4


学习...

#5



Select A.doc_id,B.xm,C.bd 
(
 select distinct doc_id from qd
) A
left join 
qd B on A.doc_id = B.doc_id 

#6


帮顶一下,我的感觉也是在应用程序端考虑这个问题,更灵活一些,

#7


应用程序端更灵活。

#1


我想要的效果是: 
104-1-a M7.5浆砌片石急流槽 D9 
        利用土方 D9 
        清理现场 D9 
        挖土方 D9 
104-1-b 单向土工格栅 D9 
        砍树挖根 D9 
        利用石方 D9 
        挖石方 D9 
104-1-c 借土填方 D9 
        借土填筑 D9 
        挖除非适用材料(包括淤泥) D9 
        锥坡填筑 D9 
104-1-c-1 Φ40cm复合桩 D9 
        砂砾 D9 
207-5-a C15混凝土基底砖砌平台沟(0.4m×0.4m) D9 
        厚150mm D9 
207-5-b C20预制块骨架护坡 D9 
        C25混凝土 D9 
就是说,doc_id相同的情况下,只显示一次,显示在第一条数据那里。 
请高手指点!

#2


lz应该从应用程序端考虑这个问题

#3


 create table qd (doc_id varchar(20),xm varchar(50),bd varchar(10))
 
insert into qd
  select '104-1-a','M7.5浆砌片石急流槽','D9' 
union all select '104-1-a','利用土方','D9' 
union all select '104-1-a','清理现场','D9' 
union all select '104-1-a','挖土方','D9' 
union all select '104-1-b','单向土工格栅','D9' 
union all select '104-1-b','砍树挖根','D9' 
union all select '104-1-b','利用石方','D9' 
union all select '104-1-b','挖石方','D9' 
union all select '104-1-c','借土填方','D9' 
union all select '104-1-c','借土填筑','D9' 
union all select '104-1-c','挖除非适用材料(包括淤泥)','D9' 
union all select '104-1-c','锥坡填筑','D9' 
union all select '104-1-c-1','Φ40cm复合桩','D9' 
union all select '104-1-c-1','砂砾','D9' 
union all select '207-5-a','C15混凝土基底砖砌平台沟(0.4m×0.4m)','D9' 
union all select '207-5-a','厚150mm','D9' 
union all select '207-5-b','C20预制块骨架护坡','D9' 
union all select '207-5-b','C25混凝土','D9' 

select doc_id=case when (select count(1) from qd where doc_id=a.doc_id and xm<=a.xm)>1 then '' else doc_id end,xm,bd from qd a  


/*
doc_id xm db
-----------------------------------------------------
104-1-a M7.5浆砌片石急流槽 D9
利用土方 D9
清理现场 D9
挖土方 D9
104-1-b 单向土工格栅 D9
砍树挖根 D9
利用石方 D9
挖石方 D9
104-1-c 借土填方 D9
借土填筑 D9
挖除非适用材料(包括淤泥) D9
锥坡填筑 D9
104-1-c-1 Φ40cm复合桩 D9
砂砾 D9
207-5-a C15混凝土基底砖砌平台沟(0.4m×0.4m) D9
厚150mm D9
207-5-b C20预制块骨架护坡 D9
C25混凝土 D9
*/


drop table qd
 

#4


学习...

#5



Select A.doc_id,B.xm,C.bd 
(
 select distinct doc_id from qd
) A
left join 
qd B on A.doc_id = B.doc_id 

#6


帮顶一下,我的感觉也是在应用程序端考虑这个问题,更灵活一些,

#7


应用程序端更灵活。