select 事业部=a.事业部, 物料使用量=sum(b.使用量) from 表A a,表B b where a.事业部=b.事业部 and charindex(','+b.物料号+',',','+a.物料号+',')>0 group by a.事业部
SELECT a.事业部,SUM(b.使用量) 物料使用量 FROM 事业部 a LEFT JOIN 明细表 b ON a.事业部=b.事业部 AND CHARINDEX(',' + b.物料号 + ',',','+a.物料号+',')>0 GROUP BY a.事业部 未经测试。感觉你的表设计有问题,数据有冗佘。
是啊,好像跟 事业部物料号对应关系表 事业部 物料号 冰箱 001,002 电子 003,004,005 這個表沒啥關係:)不過非要拆逗號,就寫個splitlist函數好了Create FUNCTION SplitList (@separator char(1), @List varchar(8000)) RETURNS @ReturnTable TABLE(ListItem varchar(1000) COLLATE Database_Default) AS BEGIN DECLARE @Index int DECLARE @NewText varchar(8000) IF @List = null RETURN SET @Index = CHARINDEX(@separator, @List) WHILE NOT(@Index = 0) BEGIN SET @NewText = RTRIM(LTRIM(LEFT(@List, @Index - 1))) SET @List = RIGHT(@List, LEN(@List) - @Index) INSERT INTO @ReturnTable(ListItem) VALUES(@NewText) SET @Index = CHARINDEX(@separator, @List) END
INSERT INTO @ReturnTable(ListItem) VALUES(RTRIM(LTRIM(@List)))
RETURN END ----還有看到上次哪位高手寫的,忘了,表怪偶 把,替換成union select的,也是可以的
如果更正了明细表,那么冗佘消除了。 写法去掉 ON后面的a.事业部=b.事业部.即 SELECT a.事业部,SUM(b.使用量) 物料使用量 FROM 事业部 a LEFT JOIN 明细表 b ON CHARINDEX(',' + b.物料号 + ',',','+a.物料号+',')>0 GROUP BY a.事业部 未经测试。
--测试环境 declare @t1 table(事业部 varchar(10),物料号 varchar(20)) insert into @t1 select '冰箱','001,002' union all select '电子','003,004,005'declare @t2 table(物料号 varchar(10),使用量 int) insert into @t2 select '001',1 union all select '002',3 union all select '003',5--查询 select 事业部=a.事业部, 物料使用量=sum(b.使用量) from @t1 a,@t2 b where charindex(','+b.物料号+',',','+a.物料号+',')>0 group by a.事业部--结果 /* 事业部 物料使用量 ---------- ----------- 冰箱 4 电子 5(2 行受影响)*/
--测试环境 Declare @事业部物料号对应关系表 Table(事业部 Nvarchar(10),物料号 Varchar(20)) Insert into @事业部物料号对应关系表 Select N'冰箱','001,002' Union All Select N'电子','003,004,005'Declare @物料使用明细表 Table(物料号 Varchar(10),使用量 Int) Insert into @物料使用明细表 Select '001',1 Union All Select '002',3 Union All Select '003',5 Select 事业部, SUM(使用量) As 物料使用量 From @事业部物料号对应关系表 A Inner Join @物料使用明细表 B On ','+A.物料号+',' Like '%,'+B.物料号+',%' Group By 事业部--Result /* 事业部 物料使用量 冰箱 4 电子 5 */
select 事业部,sum(使用量) from 事业部物料号对应关系表,料使用明细表 where 事业部物料号对应关系表.物料号 like '%'+料使用明细表.物料号+'%'group by 事业部
事业部=a.事业部,
物料使用量=sum(b.使用量)
from 表A a,表B b
where a.事业部=b.事业部 and charindex(','+b.物料号+',',','+a.物料号+',')>0
group by a.事业部
FROM 事业部 a
LEFT JOIN 明细表 b
ON a.事业部=b.事业部 AND CHARINDEX(',' + b.物料号 + ',',','+a.物料号+',')>0
GROUP BY a.事业部
未经测试。感觉你的表设计有问题,数据有冗佘。
事业部物料号对应关系表
事业部 物料号
冰箱 001,002
电子 003,004,005
這個表沒啥關係:)不過非要拆逗號,就寫個splitlist函數好了Create FUNCTION SplitList
(@separator char(1), @List varchar(8000))
RETURNS @ReturnTable TABLE(ListItem varchar(1000) COLLATE Database_Default)
AS
BEGIN
DECLARE @Index int
DECLARE @NewText varchar(8000)
IF @List = null
RETURN
SET @Index = CHARINDEX(@separator, @List)
WHILE NOT(@Index = 0)
BEGIN
SET @NewText = RTRIM(LTRIM(LEFT(@List, @Index - 1)))
SET @List = RIGHT(@List, LEN(@List) - @Index)
INSERT INTO @ReturnTable(ListItem) VALUES(@NewText)
SET @Index = CHARINDEX(@separator, @List)
END
INSERT INTO @ReturnTable(ListItem) VALUES(RTRIM(LTRIM(@List)))
RETURN
END
----還有看到上次哪位高手寫的,忘了,表怪偶
把,替換成union select的,也是可以的
写法去掉 ON后面的a.事业部=b.事业部.即
SELECT a.事业部,SUM(b.使用量) 物料使用量
FROM 事业部 a
LEFT JOIN 明细表 b
ON CHARINDEX(',' + b.物料号 + ',',','+a.物料号+',')>0
GROUP BY a.事业部
未经测试。
declare @t1 table(事业部 varchar(10),物料号 varchar(20))
insert into @t1 select '冰箱','001,002'
union all select '电子','003,004,005'declare @t2 table(物料号 varchar(10),使用量 int)
insert into @t2 select '001',1
union all select '002',3
union all select '003',5--查询
select
事业部=a.事业部,
物料使用量=sum(b.使用量)
from @t1 a,@t2 b
where charindex(','+b.物料号+',',','+a.物料号+',')>0
group by a.事业部--结果
/*
事业部 物料使用量
---------- -----------
冰箱 4
电子 5(2 行受影响)*/
Declare @事业部物料号对应关系表 Table(事业部 Nvarchar(10),物料号 Varchar(20))
Insert into @事业部物料号对应关系表 Select N'冰箱','001,002'
Union All Select N'电子','003,004,005'Declare @物料使用明细表 Table(物料号 Varchar(10),使用量 Int)
Insert into @物料使用明细表 Select '001',1
Union All Select '002',3
Union All Select '003',5
Select
事业部,
SUM(使用量) As 物料使用量
From @事业部物料号对应关系表 A
Inner Join @物料使用明细表 B
On ','+A.物料号+',' Like '%,'+B.物料号+',%'
Group By 事业部--Result
/*
事业部 物料使用量
冰箱 4
电子 5
*/