22,210
社区成员
发帖
与我相关
我的任务
分享
select top 100 P.torque as torqueName,PARAM.BOLTTYPE,opno,barcode,ICS.type,ICS.boltno,ICS.confno,ICS.torque,angle FROM ICSDATA ICS JOIN PROGRAMTORQUE P ON ICS.CONFNO=P.CONFNO JOIN PARAM ON P.TORQUE=PARAM.TORQUE WHERE ICS.ID NOT IN(select top 0 id from icsdata order by id desc) order by ICS.id desc;
5/(20-30),M16*3,OP10,111,111,3,5,2.60,1.00
5/(20-30),M16*3,OP10,111,111,3,5,2.10,1.00
5/(20-30),M16*3,OP10,111,111,3,5,2.00,1.00
2,M16*2,OP10,111,111,3,3,2.50,1.00
2,M16*2,OP10,111,111,3,3,2.40,1.00
2,M16*2,OP10,111,111,3,3,2.20,1.00
1.5,M16*1,OP10,111,111,2,2,2.40,1.00
1.5,M16*1,OP10,111,111,2,2,2.20,1.00
5/(20-30),M16*3,OP10,112,111,3,5,2.30,1.00
5/(20-30),M16*3,OP10,112,111,3,5,2.30,1.00
5/(20-30),M16*3,OP10,112,111,3,5,2.30,1.00
2,M16*2,OP10,112,111,3,3,2.30,1.00
2,M16*2,OP10,112,111,3,3,2.30,1.00
2,M16*2,OP10,112,111,3,3,2.30,1.00
1.5,M16*1,OP10,112,111,2,2,2.30,1.00
1.5,M16*1,OP10,112,111,2,2,2.30,1.00
DECLARE @cols VARCHAR(max),@sql VARCHAR(max)
with #tab as (select top 100 P.torque as torqueName,PARAM.BOLTTYPE,opno,barcode,ICS.type,ICS.boltno,ICS.confno,ICS.torque,angle FROM ICSDATA ICS JOIN PROGRAMTORQUE P ON ICS.CONFNO=P.CONFNO JOIN PARAM ON P.TORQUE=PARAM.TORQUE WHERE ICS.ID NOT IN(select top 0 id from icsdata order by id desc) order by ICS.id desc)
SELECT @cols=ISNULL(@cols+',','')+'torque'+LTRIM(sv.number)+',angle'+LTRIM(sv.number) FROM master.dbo.spt_values AS sv
CROSS APPLY(SELECT TOP 1 COUNT(0) AS cnt FROM #tab AS t GROUP BY torqueName,barcode ORDER BY COUNT(0) DESC) c
WHERE sv.type='P' AND sv.number BETWEEN 1 AND c.cnt
PRINT @cols
SET @sql='
with #tab as (select top 100 P.torque as torqueName,PARAM.BOLTTYPE,opno,barcode,ICS.type,ICS.boltno,ICS.confno,ICS.torque,angle FROM ICSDATA ICS JOIN PROGRAMTORQUE P ON ICS.CONFNO=P.CONFNO JOIN PARAM ON P.TORQUE=PARAM.TORQUE WHERE ICS.ID NOT IN(select top 0 id from icsdata order by id desc) order by ICS.id desc)
SELECT * FROM (
SELECT t.torqueName,t.BOLTTYPE,t.opno,t.barcode,t.type,t.boltno,t.confno,c.tile,c.val
FROM (
SELECT *,ROW_NUMBER()OVER(PARTITION BY torqueName,barcode,opno,type,boltno,confno ORDER BY GETDATE()) AS rn
FROM #tab
) AS t CROSS APPLY(VALUES(''torque''+LTRIM(rn),t.torque),(''angle''+LTRIM(rn),t.angle))c(tile,val)
) AS tt
PIVOT(MAX(val) FOR tile IN ('+@cols+'))p
ORDER BY p.barcode,p.torqueName DESC'
EXEC(@sql)
我用这个语句试了一下,非常好。但是有几个问题想要问一下各位高手
1、因为我的表是查询出的虚拟表,所以有一个with #tab as()。。。。。在动态SQL中执行了一次,在SQL语句中也执行了一次,有什么方法简化一下吗?
2、NULL值能否转成空字符串(出于视觉上的美观)
3、因为上位机用的是C# 不知道动态SQL部分怎么在软件上写出?
DECLARE @cols VARCHAR(max),@sql VARCHAR(max)
SELECT @cols=ISNULL(@cols+',','')+'torque'+LTRIM(sv.number)+',angle'+LTRIM(sv.number) FROM master.dbo.spt_values AS sv
CROSS APPLY(SELECT TOP 1 COUNT(0) AS cnt FROM #tab AS t GROUP BY torqueName,barcode ORDER BY COUNT(0) DESC) c
WHERE sv.type='P' AND sv.number BETWEEN 1 AND c.cnt
PRINT @cols
SET @sql='
SELECT * FROM (
SELECT t.torqueName,t.BOLTTYPE,t.opno,t.barcode,t.type,t.boltno,t.confno,c.tile,c.val
FROM (
SELECT *,ROW_NUMBER()OVER(PARTITION BY torqueName,barcode,opno,type,boltno,confno ORDER BY GETDATE()) AS rn
FROM #tab
) AS t CROSS APPLY(VALUES(''torque''+LTRIM(rn),t.torque),(''angle''+LTRIM(rn),t.angle))c(tile,val)
) AS tt
PIVOT(MAX(val) FOR tile IN ('+@cols+'))p
ORDER BY p.barcode,p.torqueName DESC'
EXEC(@sql)
+------------+----------+------+---------+------+--------+--------+---------+--------+---------+--------+---------+--------+
| torqueName | BOLTTYPE | opno | barcode | type | boltno | confno | torque1 | angle1 | torque2 | angle2 | torque3 | angle3 |
+------------+----------+------+---------+------+--------+--------+---------+--------+---------+--------+---------+--------+
| 5/(20-30) | M16*3 | OP10 | 111 | 111 | 3 | 5 | 2.6 | 1 | 2.1 | 1 | 2 | 1 |
| 2 | M16*2 | OP10 | 111 | 111 | 3 | 3 | 2.5 | 1 | 2.4 | 1 | 2.2 | 1 |
| 1.5 | M16*1 | OP10 | 111 | 111 | 2 | 2 | 2.4 | 1 | 2.2 | 1 | NULL | NULL |
| 5/(20-30) | M16*3 | OP10 | 112 | 111 | 3 | 5 | 2.3 | 1 | 2.3 | 1 | 2.3 | 1 |
| 2 | M16*2 | OP10 | 112 | 111 | 3 | 3 | 2.3 | 1 | 2.3 | 1 | 2.3 | 1 |
| 1.5 | M16*1 | OP10 | 112 | 111 | 2 | 2 | 2.3 | 1 | 2.3 | 1 | NULL | NULL |
+------------+----------+------+---------+------+--------+--------+---------+--------+---------+--------+---------+--------+
CREATE TABLE #tab(torqueName VARCHAR(100),BOLTTYPE VARCHAR(100),opno VARCHAR(100),barcode VARCHAR(100),type VARCHAR(100),boltno VARCHAR(100),confno VARCHAR(100),torque FLOAT,angle FLOAT)
INSERT INTO #tab
SELECT '5/(20-30)','M16*3','OP10','111','111','3','5','2.60','1.00' UNION ALL
SELECT '5/(20-30)','M16*3','OP10','111','111','3','5','2.10','1.00' UNION ALL
SELECT '5/(20-30)','M16*3','OP10','111','111','3','5','2.00','1.00' UNION ALL
SELECT '2','M16*2','OP10','111','111','3','3','2.50','1.00' UNION ALL
SELECT '2','M16*2','OP10','111','111','3','3','2.40','1.00' UNION ALL
SELECT '2','M16*2','OP10','111','111','3','3','2.20','1.00' UNION ALL
SELECT '1.5','M16*1','OP10','111','111','2','2','2.40','1.00' UNION ALL
SELECT '1.5','M16*1','OP10','111','111','2','2','2.20','1.00' UNION ALL
SELECT '5/(20-30)','M16*3','OP10','112','111','3','5','2.30','1.00' UNION ALL
SELECT '5/(20-30)','M16*3','OP10','112','111','3','5','2.30','1.00' UNION ALL
SELECT '5/(20-30)','M16*3','OP10','112','111','3','5','2.30','1.00' UNION ALL
SELECT '2','M16*2','OP10','112','111','3','3','2.30','1.00' UNION ALL
SELECT '2','M16*2','OP10','112','111','3','3','2.30','1.00' UNION ALL
SELECT '2','M16*2','OP10','112','111','3','3','2.30','1.00' UNION ALL
SELECT '1.5','M16*1','OP10','112','111','2','2','2.30','1.00' UNION ALL
SELECT '1.5','M16*1','OP10','112','111','2','2','2.30','1.00'
DECLARE @cols VARCHAR(max),@sql VARCHAR(max)
SELECT @cols=ISNULL(@cols+',','')+'torque'+LTRIM(sv.number)+',angle'+LTRIM(sv.number) FROM master.dbo.spt_values AS sv
CROSS APPLY(SELECT TOP 1 COUNT(0) AS cnt FROM #tab AS t GROUP BY torqueName,barcode ORDER BY COUNT(0) DESC) c
WHERE sv.type='P' AND sv.number BETWEEN 1 AND c.cnt
PRINT @cols
SET @sql='
SELECT * FROM (
SELECT t.torqueName,t.BOLTTYPE,t.opno,t.barcode,t.type,t.boltno,t.confno,c.tile,c.val
FROM (
SELECT *,ROW_NUMBER()OVER(PARTITION BY torqueName,barcode,opno,type,boltno,confno ORDER BY GETDATE()) AS rn
FROM #tab
) AS t CROSS APPLY(VALUES(''torque''+LTRIM(rn),t.torque),(''angle''+LTRIM(rn),t.angle))c(tile,val)
) AS tt
PIVOT(MAX(val) FOR tile IN (torque1,angle1,torque2,angle2,torque3,angle3))p
ORDER BY p.barcode,p.torqueName DESC'
EXEC(@sql)
torqueName BOLTTYPE opno barcode type boltno confno torque1 angle1 torque2 angle2 torque3 angle3
5/(20-30) M16*3 OP10 111 111 3 5 2.6 1 2.1 1 2 1
2 M16*2 OP10 111 111 3 3 2.5 1 2.4 1 2.2 1
1.5 M16*1 OP10 111 111 2 2 2.4 1 2.2 1 NULL NULL
5/(20-30) M16*3 OP10 112 111 3 5 2.3 1 2.3 1 2.3 1
2 M16*2 OP10 112 111 3 3 2.3 1 2.3 1 2.3 1
1.5 M16*1 OP10 112 111 2 2 2.3 1 2.3 1 NULL NULL
create table test4 (name varchar(10),mytype varchar(10),cj int )
insert into test4
values('张三','语文',83),
('张三','数学',65),
('张三','物理',85),
('李四','语文',73),
('李四','数学',69),
('李四','物理',93)
select name,
stuff((select ','+mytype from test4 t4 where t4.name = test4.name for xml path('')),1,1,'') as mytype,
stuff((select ','+cast(cj as varchar) from test4 t4 where t4.name = test4.name for xml path('')),1,1,'') as cj
from test4
group by name
/*
name mytype cj
李四 语文,数学,物理 73,69,93
张三 语文,数学,物理 83,65,85