我有两个SQL Server 2008R2表,如下所示:
Tbl_Item
(Item_Id
)Tbl_Item_Cost
(Item_Id, Item_Cost
)表中的值如下:
Tbl_Item
:
Item_Id
--------------------
Candy
Chocolate
IceCream
Chocolate/IceCream
Tbl_Item_Cost
:
Item_Id Item_Cost
----------------------
Candy 10
Chocolate 20
IceCream 30
现在我要显示项目及其成本。巧克力/ IceCream的成本应该是添加巧克力和IceCream,即20 + 30 = 50。所以结果看起来应该是
Item_Id Item_Cost
-----------------------
Candy 10
Chocolate 20
IceCream 30
IceCream/Chocolate 50
在SQL Server 2008R2中执行此操作的最简单方法是什么?
答案 0 :(得分:0)
我会这样做:
SELECT t1.item_id+'/'+t2.item_id, t1.cost+t2.cost
FROM tbl_item_cost t1 INNER JOIN tbl_item_cost t2 ON t1.item_id<>t2.item_id
我们还可以使用CROSS JOIN,它允许我们从集(xn, yn)
中获取所有可能的对X={x1, x2, ..., xn}, Y={y1, y2, ... , yn}
。这里X=Y
。但是我们会得到对(xi, xi)
- 例如:冰淇淋/冰淇淋。
答案 1 :(得分:0)
最简单的方法是使用包含项目组合的其他表格。 即
Products
ID Name
1 Chocolate And Icecream
2 Chocolate
3 Icecream
Items
ProductID SubItemId
1 1
1 2
2 1
3 2
Sub_Items
1 Chocolate 20
2 Iceceam 30
像巧克力/冰淇淋这样的多列值不会这样做。
您的查询将类似
Select p.Name, sum(s.cost)
From Products p
inner join items i on p.id = i.ProductID
inner join sub_Items s on i.SubItemId = s.Id
group by p.id
答案 2 :(得分:0)
function Split()
auto increment Id
Tbl_Item
醇>
<强> 1.function Split()
强>
create FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1))
returns @temptable TABLE (items varchar(MAX))
as
begin
declare @idx int
declare @slice varchar(8000)
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(Items) values(@slice)
set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
end
return
end;
<强> 2.Add column
强>
Alter table Tbl_Item
Add Id Int Identity(1, 1)
查询:
select TI.Item_Id,t.Cost
from Tbl_Item TI
inner join (
select T.ID,sum(TIC.[Item_Cost]) as Cost
from (select Id,items
from Tbl_Item
cross apply dbo.split([Item_Id], '/'))t
inner join Tbl_Item_Cost TIC on TIC.[Item_Id]=t.items
group by T.ID
)t on t.Id=TI.id
<强> SQL Fiddle to test 强>
答案 3 :(得分:0)
好。由于你没有改变设计的选择,虽然硬编码任何东西都不好,但如果你真的希望这只发生(总是)这两个项目,你可以试试这个。
SELECT I.Item_Id,CASE WHEN I.Item_Id='Chocolate/IceCream' THEN (SELECT SUM(Item_Cost) FROM dbo.Tbl_Item_Cost WHERE Item_Id IN ('Chocolate','IceCream')) ELSE Item_Cost END AS Item_Cost
FROM dbo.Tbl_Item_Cost C
RIGHT JOIN dbo.Tbl_Item I ON I.Item_Id=C.Item_Id
结果:
如果我遗失了某些内容,请告诉我,以便我能找到更好的解决方案。