SQL添加价格以生成蛋糕表

SQL添加价格以生成蛋糕表,sql,sql-server,multiple-columns,multi-table,Sql,Sql Server,Multiple Columns,Multi Table,我真的希望有人能帮我处理这个sql查询,一直在绞尽脑汁,但我知道这是可能的…这是我当前的查询,并生成正确的格式: DECLARE @Price1 NVARCHAR(20), @Price2 NVARCHAR(20), @Price3 NVARCHAR(20), @Price4 NVARCHAR(20) SET @Price1 = (select Price from CakeSize where SizeId = '1') SET @Price2 = (select Price from Ca

我真的希望有人能帮我处理这个sql查询,一直在绞尽脑汁,但我知道这是可能的…这是我当前的查询,并生成正确的格式:

DECLARE
@Price1 NVARCHAR(20),
@Price2 NVARCHAR(20),
@Price3 NVARCHAR(20),
@Price4 NVARCHAR(20)

SET @Price1 = (select Price from CakeSize where SizeId = '1')
SET @Price2 = (select Price from CakeSize where SizeId = '2')
SET @Price3 = (select Price from CakeSize where SizeId = '3')
SET @Price4 = (select Price from CakeSize where SizeId = '4')

SELECT

c.Name_en as Flavor,
@Price1 as Price1,
@Price2 as Price2,
@Price3 as Price3,
@Price4 as Price4


FROM
cake a
 Left outer JOIN CakeSize b ON a.SizeId = b.SizeId
 Left outer JOIN CakeFlavor c ON a.FlavorId = c.FlavorId
 Left outer JOIN CakeFilling d ON a.FillingId = d.FillingId
 Left outer JOIN CakeIcing f ON a.IcingId = f.IcingId
group by c.Name_en

我似乎无法从所有的桌子和显示器上得到所有价格的总和


我能够检索数据,但不能像上面那样格式化它

SELECT 

   c.Name_en as Flavor,
   ISNULL(b.Price, 0) + ISNULL(c.Price, 0) + ISNULL(d.Price, 0) +  ISNULL(f.Price, 0) as aPrice,
   ISNULL(b.Price, 0) + ISNULL(c.Price, 0) + ISNULL(d.Price, 0) + ISNULL(f.Price, 0) as bPrice,
  ISNULL(b.Price, 0) + ISNULL(c.Price, 0) + ISNULL(d.Price, 0) + ISNULL(f.Price, 0) as cPrice,
    ISNULL(b.Price, 0) + ISNULL(c.Price, 0) + ISNULL(d.Price, 0) + ISNULL(f.Price, 0) as dPrice

FROM
   cake a
          Left Outer JOIN CakeSize b
                 ON a.SizeId = b.SizeId
          Left Outer JOIN CakeFlavor c
                 ON a.FlavorId = c.FlavorId
          Left Outer JOIN CakeFilling d
                 ON a.FillingId = d.FillingId
          Left Outer JOIN CakeIcing f
                 ON a.IcingId = f.IcingId

巧克力蛋糕不是4行,我想有上面的输出;巧克力蛋糕一排。(胡萝卜蛋糕比其他的少5美元) 正确的数据,错误的格式 列aPrice第1、2、3、4行包含巧克力蛋糕的正确值。

(每种口味需要以下格式)

巧克力18.9518.9523.5038.50好的, 所以你想得到按大小分组的所有味道的总价, 总价格是根据每种口味的价格+馅料价格+糖衣价格来计算的,对吗

备选案文1。 如果大小是静态的,并且从不改变, 你可以这样做

select Flavor, SUM(aPrice) as aPrice, SUM(bPrice) as bPrice, SUM(cPrice) as cPrice, SUM(dPrice) as dPrice
from (
    select c.Name_en as Flavor, 
        ISNULL(b.Price, 0) + ISNULL(c.Price, 0) + ISNULL(d.Price, 0) +  ISNULL(f.Price, 0) as aPrice,
        0 as bPrice, 0 as cPrice, 0 as dPrice
    from cake a 
        Left JOIN CakeSize b ON a.SizeId = b.SizeId
        Left JOIN CakeFlavor c ON a.FlavorId = c.FlavorId
        Left JOIN CakeFilling d ON a.FillingId = d.FillingId
        Left JOIN CakeIcing f ON a.IcingId = f.IcingId
    where b.sizeid = '1'

    UNION ALL

    select c.Name_en as Flavor, 0 as aPrice,
        ISNULL(b.Price, 0) + ISNULL(c.Price, 0) + ISNULL(d.Price, 0) +  ISNULL(f.Price, 0) as bPrice, 
        0 as cPrice, 0 as dPrice
    from cake a 
        Left JOIN CakeSize b ON a.SizeId = b.SizeId
        Left JOIN CakeFlavor c ON a.FlavorId = c.FlavorId
        Left JOIN CakeFilling d ON a.FillingId = d.FillingId
        Left JOIN CakeIcing f ON a.IcingId = f.IcingId
    where b.sizeid = '2'

    UNION ALL

    select c.Name_en as Flavor, 0 as aPrice, 0 as bPrice,
        ISNULL(b.Price, 0) + ISNULL(c.Price, 0) + ISNULL(d.Price, 0) +  ISNULL(f.Price, 0) as cPrice,
        0 as dPrice
    from cake a 
        Left JOIN CakeSize b ON a.SizeId = b.SizeId
        Left JOIN CakeFlavor c ON a.FlavorId = c.FlavorId
        Left JOIN CakeFilling d ON a.FillingId = d.FillingId
        Left JOIN CakeIcing f ON a.IcingId = f.IcingId
    where b.sizeid = '3'

    UNION ALL

    select c.Name_en as Flavor, 0 as aPrice, 0 as bPrice, 0 as cPrice, 
        ISNULL(b.Price, 0) + ISNULL(c.Price, 0) + ISNULL(d.Price, 0) +  ISNULL(f.Price, 0) as dPrice
    from cake a 
        Left JOIN CakeSize b ON a.SizeId = b.SizeId
        Left JOIN CakeFlavor c ON a.FlavorId = c.FlavorId
        Left JOIN CakeFilling d ON a.FillingId = d.FillingId
        Left JOIN CakeIcing f ON a.IcingId = f.IcingId
    where b.sizeid = '4'        
) a
where flavor is not null
group by Flavor
备选案文2。 如果大小是动态的,您可以在列和行之间转换。。。 你可以在这里学习:

编辑:在第三个和第四个选择之间添加“全部联合”,感谢Sam Axe 已编辑:在第二个查询中添加逗号
编辑:添加“where flavor is not null”以避免null flavor

我可以做到这一点,但我认为一定有更好的方法来做到这一点。因此,我只是把它放在这里作为备用答案

首先,我们可以立即创建一个表来存储表的数据,并添加一个大小列:

 SELECT 
  c.Name_en as Flavor,
  b.SizeId,
   ISNULL(b.Price,0)+ISNULL(c.Price,0)+ISNULL(d.Price,0)+ISNULL(f.Price,0) as Price -- do the price 4 times is meaningless so i cut them out just keep 1 left
 INTO #cakeP --i saw your tag as sqlserver so i create temp table like this
  FROM
  cake a
      Left Outer JOIN CakeSize b
             ON a.SizeId = b.SizeId
      Left Outer JOIN CakeFlavor c
             ON a.FlavorId = c.FlavorId
      Left Outer JOIN CakeFilling d
             ON a.FillingId = d.FillingId
      Left Outer JOIN CakeIcing f
             ON a.IcingId = f.IcingId
然后我们必须做一件蠢事:

    select 
       coalesce(a.Flavor,b.Flavor,c.Flavor,d.Flavor) as Flavor,
       a.price as aPrice,
       b.price as bPrice,
       c.price as cPrice,
       d.price as dPrice
       from 
         (select Flavor,size,price from #cakeP where SizeId=1) a
       full join (select Flavor,size,price from #cakeP where SizeId=2) b
            on a.Flavor = b.Flavor
       full join (select Flavor,size,price from #cakeP where SizeId=3) c
            on a.Flavor = c.Flavor
       full join (select Flavor,size,price from #cakeP where SizeId=4) d
            on a.Flavor = d.Flavor
这件事将会完成

注:

  • 如果味道没有大小1,那么这将是螺丝钉-好的,我找到方法来修复这个使用完全连接
  • 味道大小为1,那么就可以了,但会发生这种情况:

    实验:口味巧克力大小1,3,4。然后数据将是:巧克力10空30 40


  • 希望这能帮助你

    这感觉像是一个家庭作业问题。除此之外,我觉得你也应该在某个地方总结一下。对于这样的问题,它将帮助人们用一些测试数据来回答。试着为我们设置它,它会使玩起来更容易!不是家庭作业问题,我正在为工作而做的项目。我会尝试在sqlfiddle上设置一些东西。comdude,这些表很重要,只要把它们放在上面,我们就可以清楚地看到问题了。有很多不必要的左连接。如果您不使用单个表来检查某些内容,则左侧联接不会向查询中添加任何内容或以任何方式更改结果。请参见此处的示例您忘记了将所有内容合并到第三个和第四个选项中。Ivan:上面的查询还是我的查询?Ivan yours我收到的消息为102,级别15,状态1,第17行“ISNULL”附近的语法不正确。Msg 102,15级,状态1,第48行“')”附近语法不正确。@ookie。。。是的。。。上面的查询。。。在一行中产生所有味道。。。每种尺码的价格加起来…似乎会额外返回一行“Null”作为味道??我的计算机上的sql查询窗口中出现错误?