2017-02-04 12 views
0

私はkcal(int)という名前のフィールドを持っていて、別の条件の値を合計したいと思います。最初にkcalフィールドを選択できたら、これは次のようになりますが、列がいくつかの条件を満たしている合計の値が必要です。フィールドを選択せず​​にSQLの同じフィールドを合計する方法

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つのproduct_name(それぞれ異なる料理の値(1,2,3のいずれでもよい))、3つの組み合わせのtotal_kcal、3つの組み合わせの合計価格、条件と価格< 50の合計とそのためにキロカロリー< 2000年の合計が、私はこれを書いていること:

SELECT (SELECT product_name FROM Menu WHERE dish = 1) AS Dish1, (SELECT product_name FROM Menu WHERE dish = 2) AS Dish2, (SELECT product_name FROM Menu WHERE dish = 3) AS Dish3, SUM(kcal) AS Total_Kcal , SUM(price) as Total_Price FROM Menu WHERE dish IN (1, 2, 3) GROUP BY dish HAVING SUM(pret) < 50 AND SUM(kcal) < 2000 

それは和が対応していない問題で、うまく動作します。

+0

K2 ASキロカロリー、サンプルデータと予想される出力 – GurV

+0

'K1 ASキロカロリーSELECTを投稿してください、kcal AS k3、(kcal * 3).. 'は意味をなさないが、あなたの無効なクエリと同じことをするだろう。 –

+0

@PaulSpiegel私はそれがないことを知っていますが、私はこれを書くと、実際に何をする必要があるかを知ることを望みました。フィールドValue1とValue2を持つテーブルがあった場合、SELECT Value1、Value2、(Value1 + Value2)FROMテーブル。 – Liviu

答えて

1

あり、より良い方法であることが、CROSSは私に条件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 
+1

あなたは本当のMVPです。どうもありがとうございます。これに多くの問題があった。 – Liviu

+0

賛辞をいただき、ありがとうございました。より良い方法があれば、私はそれを見たいと思っています。なぜなら、クロスジョインは悪名高い非効率的だからです。 –

0

どちらのベース列名と式を繰り返すか、サブクエリを使用します。

SELECT t.*, (k1 + k2 + k3) 
FROM (SELECT kcal AS k1, kcal AS k2, kcal AS k3 
     FROM table 
     WHERE ... 
    ) t; 

は、なぜあなたは、サブクエリなしでカラムのエイリアスを繰り返すことはできませんか?シンプル。 SQLはSELECTの式の評価順序を保証しません。したがって、最後の式は実行された最初の式になります。 。 。​​はわかりません。

このようなサブクエリを使用すると、MySQLがサブクエリを実現するため、追加のオーバーヘッドが発生することにも注意してください。パフォーマンスを向上させるには、副問合せなしで(kcal + kcal + kcal)を使用する必要があります。

+0

私の質問に再訪できますか?私はそれを私のニーズに合うように編集し、答えに感謝します。 – Liviu

関連する問題