如何通过SQLSERVER语句得到如下结果。

图片说明

我的方法有点繁琐,每一步的操作都用临时表装起来了,你可以以此执行查看每一个临时表来看懂整个操作的逻辑。我能力有限,这不一定是tsql的最优解,可以参考下

IF OBJECT_ID('TEMPDB..#Tab1') IS NOT NULL
DROP TABLE #Tab1
select * into #Tab1 from (
select sfcno = 10, time = '08:00' 
union all
select sfcno = 10, time = '08:10' 
union all
select sfcno = 11, time = '08:30' 
union all
select sfcno = 22, time = '09:10' 
union all
select sfcno = 33, time = '10:10' 
union all
select sfcno = 44, time = '11:10' 
union all
select sfcno = 555, time = '11:30' 

) as Tab1

IF OBJECT_ID('TEMPDB..#Tab2') IS NOT NULL
DROP TABLE #Tab2
select * into #Tab2 from (
select 
time = case when left(time,1)=0 then substring(time,2,1)+':00-'+cast(substring(time,2,1)+1 as nvarchar)+':00' 
else substring(time,1,2)+':00-'+cast(substring(time,1,2)+1 as nvarchar)+':00' end
,sfcno
from 
#Tab1
group by 
case when left(time,1)=0 then substring(time,2,1)+':00-'+cast(substring(time,2,1)+1 as nvarchar)+':00' 
else substring(time,1,2)+':00-'+cast(substring(time,1,2)+1 as nvarchar)+':00' end
,sfcno
) as Tab2

IF OBJECT_ID('TEMPDB..#Tab3') IS NOT NULL
DROP TABLE #Tab3
select * into #Tab3 from (
select
time
,sfcno = (Select cast(a2.sfcno as varchar)+',' from #Tab2 as a2 where a2.time = a1.time for xml path('')) 
from
#Tab2 as a1  
group by 
time
) as Tab3

select * from #Tab3 pivot (max(sfcno) for time in ([8:00-9:00],[9:00-10:00],[10:00-11:00],[11:00-12:00])) b

最后执行结果比较贴近。可以利用substring与len函数来消除末尾多余的逗号,这里就不继续下去了。如果需要代码我可以继续贴上去。
图片说明

https://www.bbsmax.com/A/kvJ3oj79Jg/

sql不擅长处理这样的,也就是很难通过一个sql来实现你要的结果,一般是要借助函数或存储过程实现,这样的话,还是放在程序里处理比较好

竟然出现两个差不多的问题。分组,纵向列变横向列

图片说明

图片说明

SELECT 

ROUND(SUM(CASE WHEN DATA_ITEM_CODE='BACKN52'  THEN DATA_ITEM_VALUE ELSE '0' END),2) AS 磨煤机入口压力,ROUND(SUM(CASE WHEN DATA_ITEM_CODE='BACKN53'  THEN DATA_ITEM_VALUE ELSE '0' END),2)  AS 磨煤机加载压力,

ROUND(SUM(CASE WHEN DATA_ITEM_CODE = 'BACKN54'  THEN DATA_ITEM_VALUE ELSE '0' END), 2) AS 收粉器入口压力, ROUND(SUM(CASE WHEN DATA_ITEM_CODE = 'BACKN55'  THEN DATA_ITEM_VALUE ELSE '0' END), 2)  AS 收粉器出口压力,

 ROUND(SUM(CASE WHEN DATA_ITEM_CODE = 'BACKN56'  THEN DATA_ITEM_VALUE ELSE '0' END), 2) AS 煤粉仓重, ROUND(SUM(CASE WHEN DATA_ITEM_CODE = 'BACKN57'  THEN DATA_ITEM_VALUE ELSE '0' END), 2)  AS 废气温度

 from(SELECT * FROM TABLE_NAME WHERE WORK_TIME >= TO_CHAR('20200921' - 1) || '200000' AND WORK_TIME <'20200921'|| '200000' ) group by WORK_TIME ORDER BY WORK_TIME;

关键字 CASE WHEN...THEN..ELSE..END
分组汇总后进行纵列变横列(上边的数据、图片仅供展示)