如何添加相同的列值但具有不同的ID

时间:2014-04-17 08:50:40

标签: sql sql-server tsql sql-server-2008-r2

我有两个SQL Server 2008R2表,如下所示:

  • Tbl_ItemItem_Id
  • Tbl_Item_CostItem_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中执行此操作的最简单方法是什么?

4 个答案:

答案 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)

  1. 您已创建 function Split()
  2. 您必须在表格 auto increment Id
  3. 中添加 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

结果:
enter image description here

如果我遗失了某些内容,请告诉我,以便我能找到更好的解决方案。

相关问题