表A
ORDERID PROID Weight UPrice
001 A 10.521 1.45
001 B 290.000 2.09
001 C 87.154 12.9
002 B 12.220 18.00
003 E 16.997 21.18
表B
ORDERID Caption Price
001 物流费 1200
001 报关费 2000
001 仓储费 800
002 仓储费 200
003 物流费 300
003 报关费 2000
003 仓储费 300形成表C
ORDERID PROID Weight UPrice 物流费 报关费 仓储费
001 A 10.521 1.45 1200*(10.521/(10.521+290.000+87.154)) 2000*百分比 800*百分比
--单据的总物流费是根据总重量来录入的 同物流费
--总物流费*(A的重量除以单据001总重量) 的百分比
001 B 290.000 2.09 1200*(290.000/(10.521+290.000+87.154)) 2000*百分比 800*百分比
001 C 87.154 12.9 1200*(87.154/(10.521+290.000+87.154)) 2000*百分比 800*百分比
002 B 12.220 18.00 0(无物流费) 0(无报关费) 200*百分比
003 E 16.997 21.18 300*(16.997/(16.997)) 2000*百分比 300*百分比
ORDERID PROID Weight UPrice
001 A 10.521 1.45
001 B 290.000 2.09
001 C 87.154 12.9
002 B 12.220 18.00
003 E 16.997 21.18
表B
ORDERID Caption Price
001 物流费 1200
001 报关费 2000
001 仓储费 800
002 仓储费 200
003 物流费 300
003 报关费 2000
003 仓储费 300形成表C
ORDERID PROID Weight UPrice 物流费 报关费 仓储费
001 A 10.521 1.45 1200*(10.521/(10.521+290.000+87.154)) 2000*百分比 800*百分比
--单据的总物流费是根据总重量来录入的 同物流费
--总物流费*(A的重量除以单据001总重量) 的百分比
001 B 290.000 2.09 1200*(290.000/(10.521+290.000+87.154)) 2000*百分比 800*百分比
001 C 87.154 12.9 1200*(87.154/(10.521+290.000+87.154)) 2000*百分比 800*百分比
002 B 12.220 18.00 0(无物流费) 0(无报关费) 200*百分比
003 E 16.997 21.18 300*(16.997/(16.997)) 2000*百分比 300*百分比
解决方案 »
- 触发器
- 关于SQL INSERT多行多列的问题
- 一个简单存储过程为什么不对呢,把一个表中的所有null替换成'',或者0
- sql存储过程错误,怎么办?语句如下:
- 当SQLServerAgent 正在启动时,无法执行此操作。请稍候再试
- 在装sql server2005时电脑就自动重启是怎么回事啊?急急急!!!
- 我用了TEXT类型来做为存字符,我需要将字段里面的字符再加上新增加的字符。要怎么办?
- 始终看不明白这个存储过程的意思,急求帮助阿!!!!
- 一句SQL语句?
- ASP与SQL SERVER 2000的数据库关联问题,库中来两表通过一相同字段建立关联,和显示的问题!高手指教:)
- vs2005连接sql server2000超时问题
- 求教这是什么样的查询语句
IF OBJECT_ID('[A]') IS NOT NULL
DROP TABLE [A]
GO
CREATE TABLE [A] ([ORDERID] [nvarchar](10),[PROID] [nvarchar](10),[Weight] [numeric](6,3),[UPrice] [numeric](4,2))
INSERT INTO [A]
SELECT '001','A','10.521','1.45' UNION ALL
SELECT '001','B','290.000','2.09' UNION ALL
SELECT '001','C','87.154','12.9' UNION ALL
SELECT '002','B','12.220','18.00' UNION ALL
SELECT '003','E','16.997','21.18'--> 生成测试数据表: [B]
IF OBJECT_ID('[B]') IS NOT NULL
DROP TABLE [B]
GO
CREATE TABLE [B] ([ORDERID] [nvarchar](10),[Caption] [nvarchar](10),[Price] [int])
INSERT INTO [B]
SELECT '001','物流费','1200' UNION ALL
SELECT '001','报关费','2000' UNION ALL
SELECT '001','仓储费','800' UNION ALL
SELECT '002','仓储费','200' UNION ALL
SELECT '003','物流费','300' UNION ALL
SELECT '003','报关费','2000' UNION ALL
SELECT '003','仓储费','300'--SELECT * FROM [A]
--SELECT * FROM [B]-->SQL查询如下:
SELECT a.*,
物流费=CAST(CASE SUM([Weight])OVER(PARTITION BY a.[ORDERID]) WHEN 0 THEN 0
ELSE ISNULL(物流费,0)*([Weight]/SUM([Weight])OVER(PARTITION BY a.[ORDERID])) END AS DEC(18,2)),
报关费=CAST(CASE SUM([Weight])OVER(PARTITION BY a.[ORDERID]) WHEN 0 THEN 0
ELSE ISNULL(报关费,0)*([Weight]/SUM([Weight])OVER(PARTITION BY a.[ORDERID])) END AS DEC(18,2)),
仓储费=CAST(CASE SUM([Weight])OVER(PARTITION BY a.[ORDERID]) WHEN 0 THEN 0
ELSE ISNULL(仓储费,0)*([Weight]/SUM([Weight])OVER(PARTITION BY a.[ORDERID])) END AS DEC(18,2))
FROM A AS a
LEFT JOIN (
SELECT *
FROM b
PIVOT(
MAX(Price)
FOR Caption IN(物流费,报关费,仓储费)
) p
) AS b
ON a.ORDERID=b.ORDERID/*
ORDERID PROID Weight UPrice 物流费 报关费 仓储费
---------- ---------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
001 A 10.521 1.45 32.57 54.28 21.71
001 B 290.000 2.09 897.66 1496.10 598.44
001 C 87.154 12.90 269.77 449.62 179.85
002 B 12.220 18.00 0.00 0.00 200.00
003 E 16.997 21.18 300.00 2000.00 300.00(5 行受影响)
*/
IF OBJECT_ID('[A]') IS NOT NULL
DROP TABLE [A]
GO
CREATE TABLE [A] ([ORDERID] [nvarchar](10),[PROID] [nvarchar](10),[Weight] [numeric](6,3),[UPrice] [numeric](4,2))
INSERT INTO [A]
SELECT '001','A','10.521','1.45' UNION ALL
SELECT '001','B','290.000','2.09' UNION ALL
SELECT '001','C','87.154','12.9' UNION ALL
SELECT '002','B','12.220','18.00' UNION ALL
SELECT '003','E','16.997','21.18'--> 生成测试数据表: [B]
IF OBJECT_ID('[B]') IS NOT NULL
DROP TABLE [B]
GO
CREATE TABLE [B] ([ORDERID] [nvarchar](10),[Caption] [nvarchar](10),[Price] [int])
INSERT INTO [B]
SELECT '001','物流费','1200' UNION ALL
SELECT '001','报关费','2000' UNION ALL
SELECT '001','仓储费','800' UNION ALL
SELECT '002','仓储费','200' UNION ALL
SELECT '003','物流费','300' UNION ALL
SELECT '003','报关费','2000' UNION ALL
SELECT '003','仓储费','300'--SELECT * FROM [A]
--SELECT * FROM [B]-->SQL查询如下:
SELECT a.*,
物流费=CAST(ISNULL(物流费,0)*([Weight]/SUM([Weight])OVER(PARTITION BY a.[ORDERID])) AS DEC(18,2)),
报关费=CAST(ISNULL(报关费,0)*([Weight]/SUM([Weight])OVER(PARTITION BY a.[ORDERID])) AS DEC(18,2)),
仓储费=CAST(ISNULL(仓储费,0)*([Weight]/SUM([Weight])OVER(PARTITION BY a.[ORDERID])) AS DEC(18,2))
FROM A AS a
LEFT JOIN (
SELECT *
FROM b
PIVOT(
MAX(Price)
FOR Caption IN(物流费,报关费,仓储费)
) p
) AS b
ON a.ORDERID=b.ORDERID/*
ORDERID PROID Weight UPrice 物流费 报关费 仓储费
---------- ---------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
001 A 10.521 1.45 32.57 54.28 21.71
001 B 290.000 2.09 897.66 1496.10 598.44
001 C 87.154 12.90 269.77 449.62 179.85
002 B 12.220 18.00 0.00 0.00 200.00
003 E 16.997 21.18 300.00 2000.00 300.00(5 行受影响)
*/再简化一下
--> 生成测试数据表: [A]
IF OBJECT_ID('[A]') IS NOT NULL
DROP TABLE [A]
GO
CREATE TABLE [A] ([ORDERID] [nvarchar](10),[PROID] [nvarchar](10),[Weight] [numeric](6,3),[UPrice] [numeric](4,2))
INSERT INTO [A]
SELECT '001','A','10.521','1.45' UNION ALL
SELECT '001','B','290.000','2.09' UNION ALL
SELECT '001','C','87.154','12.9' UNION ALL
SELECT '002','B','12.220','18.00' UNION ALL
SELECT '003','E','16.997','21.18'--> 生成测试数据表: [B]
IF OBJECT_ID('[B]') IS NOT NULL
DROP TABLE [B]
GO
CREATE TABLE [B] ([ORDERID] [nvarchar](10),[Caption] [nvarchar](10),[Price] [int])
INSERT INTO [B]
SELECT '001','物流费','1200' UNION ALL
SELECT '001','报关费','2000' UNION ALL
SELECT '001','仓储费','800' UNION ALL
SELECT '002','仓储费','200' UNION ALL
SELECT '003','物流费','300' UNION ALL
SELECT '003','报关费','2000' UNION ALL
SELECT '003','仓储费','300'--SELECT * FROM [A]
--SELECT * FROM [B]-->SQL查询如下:
DECLARE @fee VARCHAR(MAX),@fee1 VARCHAR(MAX)
SELECT @fee=ISNULL(@fee+',','')+QUOTENAME([Caption]),
@fee1=ISNULL(@fee1+',','')+QUOTENAME([Caption])
+'=CAST(ISNULL('+QUOTENAME([Caption])+',0)*([Weight]/SUM([Weight])OVER(PARTITION BY a.[ORDERID])) AS DEC(18,2))'
FROM B
GROUP BY [Caption]
EXEC('
SELECT a.*,'+@fee1+'
FROM A AS a
LEFT JOIN (
SELECT *
FROM b
PIVOT(
MAX(Price)
FOR Caption IN('+@fee+')
) p
) AS b
ON a.ORDERID=b.ORDERID
')
/*
ORDERID PROID Weight UPrice 报关费 仓储费 物流费
---------- ---------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
001 A 10.521 1.45 54.28 21.71 32.57
001 B 290.000 2.09 1496.10 598.44 897.66
001 C 87.154 12.90 449.62 179.85 269.77
002 B 12.220 18.00 0.00 200.00 0.00
003 E 16.997 21.18 2000.00 300.00 300.00(5 行受影响)
*/
形成表C
ORDERID PROID Weight UPrice 物流费 报关费 仓储费 费用小计费用小计=物流费+报关费+仓储费+(Weight*UPrice)