22,210
社区成员
发帖
与我相关
我的任务
分享
declare
--游标类型定义
cursor table_cur
is
select Material,Formula from Table_1
WHERE Calculate='是';
cursor table_str
IS
select projects,datass from TABLE_1
where calculate<>'是';
--定义一个游标变量table_row table_cur%ROWTYPE ,该类型为游标table_cur中的一行数据类型
table_row table_cur%rowtype;
table_cow table_str%rowtype;
Formula table_1.Formula%type;
begin
--游标for循环开始
for table_row in table_cur loop
for table_cow in table_str loop
Formula:=replace(table_row.Formula,table_cow.Projects,table_cow.Datass);
dbms_output.put_line(Formula);
end loop;
end loop;
----游标for循环结束
end;
这是 我根据前面 ”雨停了“的方法 用Orcale写出来的,但是显示出来的结果却是
使用了很多合并重复行的 函数 都是报错,有什么好的办法吗?
--DROP TABLE #Temp_1
--创建临时表数据
CREATE TABLE #Temp_1
(
ID INT,
Material VARCHAR(200),
Project VARCHAR(200),
Calcule VARCHAR(200),
Data VARCHAR(20),
Formula VARCHAR(200),
Tolerance VARCHAR(200),
Standrad VARCHAR(200)
)
INSERT INTO #Temp_1
SELECT 1,'硫酸亚铁_含量','质量','否',10,'','','' UNION ALL
SELECT 1,'硫酸亚铁_含量','体积','否',20,'','','' UNION ALL
SELECT 1,'硫酸亚铁_含量','标液','否',30,'','','' UNION ALL
SELECT 1,'硫酸亚铁_含量','含量','否',0,'体积*标液*0.27801/质量','≤0.4%',''
--先动态的将行转列方便数据的获取
DECLARE @sql VARCHAR(max)
SET @sql='select Material,max(Formula)Formula '
SELECT @sql=@sql+','+QUOTENAME(project)+N'= max(case project when '+QUOTENAME(project,N'''')+N' then cast(data as numeric(18,2)) end)'
FROM #Temp_1
GROUP BY project
exec(@sql+N' into Temp_2 from #Temp_1 GROUP BY Material')
--将数据放入实体临时表中
--动态的执行公式
declare @rule nvarchar(MAX)
select @rule=STUFF((
SELECT ' UNION ALL SELECT '''+LTRIM(Material)+''' AS Material,'''+
Formula+'''as Formula,'+
CAST([体积]AS VARCHAR(20))+' as [体积] ,'+
CAST([质量]AS VARCHAR(20))+' as [质量] ,'+
CAST([标液] AS VARCHAR(20))+'as [标液] ,'+
Formula+' AS Formula ' from Temp_2 FOR XML PATH('')),1,10,'')+'from Temp_2'
exec (@rule)
--删除临时表
DROP TABLE Temp_2
CREATE TABLE [6tb] ([fitemid] [int],[FID_V] [nvarchar](10),[FName] [nvarchar](10),[FValue] [numeric](14,10),[FExpression] [nvarchar](30))
INSERT INTO [6tb]
SELECT '8903','HBase','红本价','740.0000000000','HBase' UNION ALL
SELECT '8905','HBase','红本价','917.0000000000','HBase' UNION ALL
SELECT '8929','T1003','1KV','.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8929','T1005','1000欧姆','.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8929','HBase','红本价','200.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8931','HBase','红本价','288.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8931','T1005','1000欧姆','.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8931','T1003','1KV','.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8933','HBase','红本价','450.0000000000','HBase' UNION ALL
SELECT '8935','HBase','红本价','600.0000000000','HBase' UNION ALL
SELECT '9015','HBase','红本价','740.0000000000','(HBase+T1003+T1006)*T1009' UNION ALL
SELECT '9015','T1003','1KV','.0000000000','(HBase+T1003+T1006)*T1009' UNION ALL
SELECT '9015','T1006','100欧姆','.0000000000','(HBase+T1003+T1006)*T1009' UNION ALL
SELECT '9015','T1009','红绿色','11.0000000000','(HBase+T1003+T1006)*T1009' UNION ALL
SELECT '9017','T1009','红绿色','11.0000000000','HBase' UNION ALL
SELECT '9017','T1005','1000欧姆','.0000000000','HBase' UNION ALL
SELECT '9017','T1003','1KV','.0000000000','HBase' UNION ALL
SELECT '9017','HBase','红本价','965.0000000000','HBase' UNION ALL
SELECT '9019','HBase','红本价','1270.0000000000','HBase' UNION ALL
SELECT '9021','HBase','红本价','1790.0000000000','HBase' UNION ALL
SELECT '9029','HBase','红本价','200.0000000000','HBase' UNION ALL
SELECT '9031','HBase','红本价','288.0000000000','HBase'
CREATE TABLE GGGUU(fitemid INT,R NUMERIC(14,10))
GO
CREATE FUNCTION GetVb(@Fitemid AS INT,@FExpression nvarchar(100) )
RETURNS nvarchar(100)
AS
BEGIN
DECLARE @sql varchar(100)
SELECT @FExpression=replace(@FExpression,FId_V,ltrim(FValue)) FROM [6tb] WHERE fitemid=@Fitemid
SET @sql='INSERT GGGUU select '+LTRIM(@Fitemid)+','+@FExpression+' G'
RETURN @sql
END
GO
EXEC MASTER.dbo.xp_execresultset 'SELECT dbo.getVB(Fitemid,FExpression) FROM [6tb]',N'test'
SELECT * FROM [6TB] A INNER JOIN (SELECT DISTINCT * FROM GGGUU) B
ON A.fitemid=B.fitemid
--RESULT
/*fitemid FID_V FName FValue FExpression fitemid R
----------- ---------- ---------- ---------------- ------------------------------ ----------- ----------------
8903 HBase 红本价 740.0000000000 HBase 8903 740.0000000000
8905 HBase 红本价 917.0000000000 HBase 8905 917.0000000000
8929 T1003 1KV .0000000000 HBase+T1003+T1005 8929 200.0000000000
8929 T1005 1000欧姆 .0000000000 HBase+T1003+T1005 8929 200.0000000000
8929 HBase 红本价 200.0000000000 HBase+T1003+T1005 8929 200.0000000000
8931 HBase 红本价 288.0000000000 HBase+T1003+T1005 8931 288.0000000000
8931 T1005 1000欧姆 .0000000000 HBase+T1003+T1005 8931 288.0000000000
8931 T1003 1KV .0000000000 HBase+T1003+T1005 8931 288.0000000000
8933 HBase 红本价 450.0000000000 HBase 8933 450.0000000000
8935 HBase 红本价 600.0000000000 HBase 8935 600.0000000000
9015 HBase 红本价 740.0000000000 (HBase+T1003+T1006)*T1009 9015 8140.0000000000
9015 T1003 1KV .0000000000 (HBase+T1003+T1006)*T1009 9015 8140.0000000000
9015 T1006 100欧姆 .0000000000 (HBase+T1003+T1006)*T1009 9015 8140.0000000000
9015 T1009 红绿色 11.0000000000 (HBase+T1003+T1006)*T1009 9015 8140.0000000000
9017 T1009 红绿色 11.0000000000 HBase 9017 965.0000000000
9017 T1005 1000欧姆 .0000000000 HBase 9017 965.0000000000
9017 T1003 1KV .0000000000 HBase 9017 965.0000000000
9017 HBase 红本价 965.0000000000 HBase 9017 965.0000000000
9019 HBase 红本价 1270.0000000000 HBase 9019 1270.0000000000
9021 HBase 红本价 1790.0000000000 HBase 9021 1790.0000000000
9029 HBase 红本价 200.0000000000 HBase 9029 200.0000000000
9031 HBase 红本价 288.0000000000 HBase 9031 288.0000000000
[/quote]
replace不行,因为你列不固定,上面的行转列也不行的,因为不固定。如果你选一项当然也是可以的,我说的是批量。我建议还是程序处理。不是说某种能实现不能实现,只是选一种比较简单的方式而已。CREATE TABLE [6tb] ([fitemid] [int],[FID_V] [nvarchar](10),[FName] [nvarchar](10),[FValue] [numeric](14,10),[FExpression] [nvarchar](30))
INSERT INTO [6tb]
SELECT '8903','HBase','红本价','740.0000000000','HBase' UNION ALL
SELECT '8905','HBase','红本价','917.0000000000','HBase' UNION ALL
SELECT '8929','T1003','1KV','.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8929','T1005','1000欧姆','.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8929','HBase','红本价','200.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8931','HBase','红本价','288.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8931','T1005','1000欧姆','.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8931','T1003','1KV','.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8933','HBase','红本价','450.0000000000','HBase' UNION ALL
SELECT '8935','HBase','红本价','600.0000000000','HBase' UNION ALL
SELECT '9015','HBase','红本价','740.0000000000','(HBase+T1003+T1006)*T1009' UNION ALL
SELECT '9015','T1003','1KV','.0000000000','(HBase+T1003+T1006)*T1009' UNION ALL
SELECT '9015','T1006','100欧姆','.0000000000','(HBase+T1003+T1006)*T1009' UNION ALL
SELECT '9015','T1009','红绿色','11.0000000000','(HBase+T1003+T1006)*T1009' UNION ALL
SELECT '9017','T1009','红绿色','11.0000000000','HBase' UNION ALL
SELECT '9017','T1005','1000欧姆','.0000000000','HBase' UNION ALL
SELECT '9017','T1003','1KV','.0000000000','HBase' UNION ALL
SELECT '9017','HBase','红本价','965.0000000000','HBase' UNION ALL
SELECT '9019','HBase','红本价','1270.0000000000','HBase' UNION ALL
SELECT '9021','HBase','红本价','1790.0000000000','HBase' UNION ALL
SELECT '9029','HBase','红本价','200.0000000000','HBase' UNION ALL
SELECT '9031','HBase','红本价','288.0000000000','HBase'
CREATE TABLE GGGUU(fitemid INT,R NUMERIC(14,10))
GO
CREATE FUNCTION GetVb(@Fitemid AS INT,@FExpression nvarchar(100) )
RETURNS nvarchar(100)
AS
BEGIN
DECLARE @sql varchar(100)
SELECT @FExpression=replace(@FExpression,FId_V,ltrim(FValue)) FROM [6tb] WHERE fitemid=@Fitemid
SET @sql='INSERT GGGUU select '+LTRIM(@Fitemid)+','+@FExpression+' G'
RETURN @sql
END
GO
EXEC MASTER.dbo.xp_execresultset 'SELECT dbo.getVB(Fitemid,FExpression) FROM [6tb]',N'test'
SELECT * FROM [6TB] A INNER JOIN (SELECT DISTINCT * FROM GGGUU) B
ON A.fitemid=B.fitemid
--RESULT
/*fitemid FID_V FName FValue FExpression fitemid R
----------- ---------- ---------- ---------------- ------------------------------ ----------- ----------------
8903 HBase 红本价 740.0000000000 HBase 8903 740.0000000000
8905 HBase 红本价 917.0000000000 HBase 8905 917.0000000000
8929 T1003 1KV .0000000000 HBase+T1003+T1005 8929 200.0000000000
8929 T1005 1000欧姆 .0000000000 HBase+T1003+T1005 8929 200.0000000000
8929 HBase 红本价 200.0000000000 HBase+T1003+T1005 8929 200.0000000000
8931 HBase 红本价 288.0000000000 HBase+T1003+T1005 8931 288.0000000000
8931 T1005 1000欧姆 .0000000000 HBase+T1003+T1005 8931 288.0000000000
8931 T1003 1KV .0000000000 HBase+T1003+T1005 8931 288.0000000000
8933 HBase 红本价 450.0000000000 HBase 8933 450.0000000000
8935 HBase 红本价 600.0000000000 HBase 8935 600.0000000000
9015 HBase 红本价 740.0000000000 (HBase+T1003+T1006)*T1009 9015 8140.0000000000
9015 T1003 1KV .0000000000 (HBase+T1003+T1006)*T1009 9015 8140.0000000000
9015 T1006 100欧姆 .0000000000 (HBase+T1003+T1006)*T1009 9015 8140.0000000000
9015 T1009 红绿色 11.0000000000 (HBase+T1003+T1006)*T1009 9015 8140.0000000000
9017 T1009 红绿色 11.0000000000 HBase 9017 965.0000000000
9017 T1005 1000欧姆 .0000000000 HBase 9017 965.0000000000
9017 T1003 1KV .0000000000 HBase 9017 965.0000000000
9017 HBase 红本价 965.0000000000 HBase 9017 965.0000000000
9019 HBase 红本价 1270.0000000000 HBase 9019 1270.0000000000
9021 HBase 红本价 1790.0000000000 HBase 9021 1790.0000000000
9029 HBase 红本价 200.0000000000 HBase 9029 200.0000000000
9031 HBase 红本价 288.0000000000 HBase 9031 288.0000000000
CREATE TABLE [6tb] ([fitemid] [int],[FID_V] [nvarchar](10),[FName] [nvarchar](10),[FValue] [numeric](14,10),[FExpression] [nvarchar](30))
INSERT INTO [6tb]
SELECT '8903','HBase','红本价','740.0000000000','HBase' UNION ALL
SELECT '8905','HBase','红本价','917.0000000000','HBase' UNION ALL
SELECT '8929','T1003','1KV','.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8929','T1005','1000欧姆','.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8929','HBase','红本价','200.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8931','HBase','红本价','288.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8931','T1005','1000欧姆','.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8931','T1003','1KV','.0000000000','HBase+T1003+T1005' UNION ALL
SELECT '8933','HBase','红本价','450.0000000000','HBase' UNION ALL
SELECT '8935','HBase','红本价','600.0000000000','HBase' UNION ALL
SELECT '9015','HBase','红本价','740.0000000000','(HBase+T1003+T1006)*T1009' UNION ALL
SELECT '9015','T1003','1KV','.0000000000','(HBase+T1003+T1006)*T1009' UNION ALL
SELECT '9015','T1006','100欧姆','.0000000000','(HBase+T1003+T1006)*T1009' UNION ALL
SELECT '9015','T1009','红绿色','11.0000000000','(HBase+T1003+T1006)*T1009' UNION ALL
SELECT '9017','T1009','红绿色','11.0000000000','HBase' UNION ALL
SELECT '9017','T1005','1000欧姆','.0000000000','HBase' UNION ALL
SELECT '9017','T1003','1KV','.0000000000','HBase' UNION ALL
SELECT '9017','HBase','红本价','965.0000000000','HBase' UNION ALL
SELECT '9019','HBase','红本价','1270.0000000000','HBase' UNION ALL
SELECT '9021','HBase','红本价','1790.0000000000','HBase' UNION ALL
SELECT '9029','HBase','红本价','200.0000000000','HBase' UNION ALL
SELECT '9031','HBase','红本价','288.0000000000','HBase'
CREATE TABLE GGGUU(fitemid INT,R NUMERIC(14,10))
GO
CREATE FUNCTION GetVb(@Fitemid AS INT,@FExpression nvarchar(100) )
RETURNS nvarchar(100)
AS
BEGIN
DECLARE @sql varchar(100)
SELECT @FExpression=replace(@FExpression,FId_V,ltrim(FValue)) FROM [6tb] WHERE fitemid=@Fitemid
SET @sql='INSERT GGGUU select '+LTRIM(@Fitemid)+','+@FExpression+' G'
RETURN @sql
END
GO
EXEC MASTER.dbo.xp_execresultset 'SELECT dbo.getVB(Fitemid,FExpression) FROM [6tb]',N'test'
SELECT * FROM [6TB] A INNER JOIN (SELECT DISTINCT * FROM GGGUU) B
ON A.fitemid=B.fitemid
--RESULT
/*fitemid FID_V FName FValue FExpression fitemid R
----------- ---------- ---------- ---------------- ------------------------------ ----------- ----------------
8903 HBase 红本价 740.0000000000 HBase 8903 740.0000000000
8905 HBase 红本价 917.0000000000 HBase 8905 917.0000000000
8929 T1003 1KV .0000000000 HBase+T1003+T1005 8929 200.0000000000
8929 T1005 1000欧姆 .0000000000 HBase+T1003+T1005 8929 200.0000000000
8929 HBase 红本价 200.0000000000 HBase+T1003+T1005 8929 200.0000000000
8931 HBase 红本价 288.0000000000 HBase+T1003+T1005 8931 288.0000000000
8931 T1005 1000欧姆 .0000000000 HBase+T1003+T1005 8931 288.0000000000
8931 T1003 1KV .0000000000 HBase+T1003+T1005 8931 288.0000000000
8933 HBase 红本价 450.0000000000 HBase 8933 450.0000000000
8935 HBase 红本价 600.0000000000 HBase 8935 600.0000000000
9015 HBase 红本价 740.0000000000 (HBase+T1003+T1006)*T1009 9015 8140.0000000000
9015 T1003 1KV .0000000000 (HBase+T1003+T1006)*T1009 9015 8140.0000000000
9015 T1006 100欧姆 .0000000000 (HBase+T1003+T1006)*T1009 9015 8140.0000000000
9015 T1009 红绿色 11.0000000000 (HBase+T1003+T1006)*T1009 9015 8140.0000000000
9017 T1009 红绿色 11.0000000000 HBase 9017 965.0000000000
9017 T1005 1000欧姆 .0000000000 HBase 9017 965.0000000000
9017 T1003 1KV .0000000000 HBase 9017 965.0000000000
9017 HBase 红本价 965.0000000000 HBase 9017 965.0000000000
9019 HBase 红本价 1270.0000000000 HBase 9019 1270.0000000000
9021 HBase 红本价 1790.0000000000 HBase 9021 1790.0000000000
9029 HBase 红本价 200.0000000000 HBase 9029 200.0000000000
9031 HBase 红本价 288.0000000000 HBase 9031 288.0000000000
WITH cte AS (
SELECT a.*,b.project AS pb,b.VALUE AS bv FROM @t a JOIN @t b ON a.material=b.material AND a.value=0 AND b.value<>0
)
SELECT x.material,x.formula,(SELECT ','+y.pb+':'+CAST(y.bv AS VARCHAR(100)) FROM cte y WHERE y.material=x.material FOR XML PATH('')) FROM cte x GROUP BY x.material,x.formula
用replace实现
DECLARE @t TABLE(material NVARCHAR(100),project NVARCHAR(100),VALUE NUMERIC(10,2) ,formula NVARCHAR(100));
INSERT INTO @t (material,project,value,formula) VALUES
('a','质量',10,''),
('a','体积',20,''),
('a','标液',30,''),
('a','含量',0,'体积*标液*0.27801/质量'),
('b','质量1',0.25,''),
('b','m',10,''),
('b','含量',0,'5*m/质量1')
;WITH cte AS (
SELECT a.*,b.project AS pb,b.VALUE AS bv FROM @t a JOIN @t b ON a.material=b.material AND a.value=0 AND b.value<>0
)
SELECT x.material,x.formula,(SELECT ','+y.pb+':'+CAST(y.bv AS VARCHAR(100)) FROM cte y WHERE y.material=x.material FOR XML PATH('')) FROM cte x GROUP BY x.material,x.formula
/*
a 体积*标液*0.27801/质量 ,质量:10.00,体积:20.00,标液:30.00
b 5*m/质量1 ,质量1:0.25,m:10.00
*/
没时间了,我要下班了。只能到这里了。考虑在上面代码读取一个正常,前台一个eval()就可以出结果了。也不会太复杂。如果要在sql里计算确实会复杂很多。select
(select data from FrmMaterial where Project='体积' and Material='硫酸亚铁_含量')*
(select data from FrmMaterial where Project='标液' and Material='硫酸亚铁_含量')*
0.27801/(select data from FrmMaterial where Project='质量' and Material='硫酸亚铁_含量')
FROM FrmMaterial where project='含量' GROUP BY project
是这样吗》?但是公式太多 而且是动态的,这样 不行啊