Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不选择字段的情况下对SQL中的同一字段求和_Sql_Sql Server - Fatal编程技术网

如何在不选择字段的情况下对SQL中的同一字段求和

如何在不选择字段的情况下对SQL中的同一字段求和,sql,sql-server,Sql,Sql Server,我有一个名为kcal int的字段,我想对不同条件下的值求和。如果我可以先选择kcal字段,它应该是这样的,但我只需要求和的值,其中列满足一些条件 SELECT kcal AS k1, kcal AS k2, kcal AS k3, (k1 + k2 + k3) FROM table WHERE ... 编辑:我有这张桌子 CREATE TABLE [dbo].[Menu] ( [id_product] INT NOT NULL, [product_name] NC

我有一个名为kcal int的字段,我想对不同条件下的值求和。如果我可以先选择kcal字段,它应该是这样的,但我只需要求和的值,其中列满足一些条件

SELECT kcal AS k1, kcal AS k2, kcal AS k3, (k1 + k2 + k3) FROM table WHERE ...
编辑:我有这张桌子

CREATE TABLE [dbo].[Menu] (
[id_product]       INT        NOT NULL,
[product_name]  NCHAR (50)    NOT NULL,
[description]       TEXT      NULL,
[price]             INT       NOT NULL,
[kcal]              INT       NOT NULL,
[dish]              INT       NOT NULL,
PRIMARY KEY CLUSTERED ([id_product] ASC)
)


我想显示3种产品名称的所有可能组合,每种都有一个不同的盘值,可以是1、2或3,每3种组合的总热量,每3种组合的总价格,条件是价格总和用基本列名重复表达式或使用子查询:

SELECT t.*, (k1 + k2 + k3) 
FROM (SELECT kcal AS k1, kcal AS k2, kcal AS k3
      FROM table
      WHERE ...
     ) t;
为什么不能在没有子查询的情况下重复列别名?易于理解的SQL不保证SELECT中表达式的求值顺序。因此,最后一个表达式可能是执行的第一个表达式。k1是未知的


我还应该注意,使用这样的子查询会带来额外的开销,因为MySQL实现了子查询。您应该在不使用子查询的情况下使用kcal+kcal+kcal,以获得更好的性能。

可能有更好的方法,但对我来说,这听起来像是一个交叉连接,包含了过多的WHERE条件:

SELECT 
  m1.product_name
 ,m2.product_name
 ,m3.product_name
 ,(m1.kcal + m2.kcal + m3.kcal) AS CombinedKcal
 ,(m1.price + m2.price + m3.price) AS CombinedPrice
FROM 
  Menu AS m1
 ,Menu AS m2
 ,Menu AS m3
WHERE
  -- Ensure combinations include each dish only once.
  (m1.id_product <> m2.id_product AND m2.id_product <> m3.id_product AND m3.id_product <> m1.id_product)
AND 
  -- Ensure combinations include a dish 1, a dish 2 and a dish 3
  (m1.dish = 1 AND m2.dish = 2 AND m3.dish = 3)
AND
  -- Ensure Combined Calories is less than 2000
 (m1.kcal + m2.kcal + m3.kcal) < 2000
AND
  -- Ensure Combined Price is less than 50
 (m1.price + m2.price + m3.price) < 50

请发布样本数据和预期输出选择kcal作为k1,kcal作为k2,kcal作为k3,kcal*3。。没有意义,但会像你的无效查询一样。@PaulSpiegel我知道没有,但我希望如果我这样写,你会得到我真正需要做的。如果有一个包含Value1和Value2字段的表,请从表中选择Value1、Value2、Value1+Value2;这只是一个糟糕的例子,因为它没有回答这个问题:你为什么要这样做?这个要求没有多大意义。为什么要将同一列作为三个单独的列输出,并且求和三次呢?请您重新考虑我的问题好吗?我对它进行了编辑,使之符合我的需要,谢谢你的回答。你是真正的MVP。非常感谢你。我在这方面遇到了很多麻烦。谢谢你的夸奖,很高兴这有帮助。如果有更好的方法,我很想看看,因为我知道交叉联接的效率是出了名的低。
SELECT 
  m1.product_name
 ,m2.product_name
 ,m3.product_name
 ,(m1.kcal + m2.kcal + m3.kcal) AS CombinedKcal
 ,(m1.price + m2.price + m3.price) AS CombinedPrice
FROM 
  Menu AS m1
 ,Menu AS m2
 ,Menu AS m3
WHERE
  -- Ensure combinations include each dish only once.
  (m1.id_product <> m2.id_product AND m2.id_product <> m3.id_product AND m3.id_product <> m1.id_product)
AND 
  -- Ensure combinations include a dish 1, a dish 2 and a dish 3
  (m1.dish = 1 AND m2.dish = 2 AND m3.dish = 3)
AND
  -- Ensure Combined Calories is less than 2000
 (m1.kcal + m2.kcal + m3.kcal) < 2000
AND
  -- Ensure Combined Price is less than 50
 (m1.price + m2.price + m3.price) < 50