2016-04-29 14 views
0

私は、次のクエリを持っている:集計クエリ(SUM)

SELECT UserId, (
       0.099 * 
        ( 
        CASE WHEN 
        (SELECT AcceleratedProfitPercentage FROM CustomGroups cg 
        INNER JOIN UserCustomGroups ucg ON ucg.CustomGroupId = cg.Id 
        WHERE Packs.UserCustomGroupId = ucg.Id) 
        IS NOT NULL THEN 
        ((SELECT AcceleratedProfitPercentage FROM CustomGroups cg 
        INNER JOIN UserCustomGroups ucg ON ucg.CustomGroupId = cg.Id 
        WHERE Packs.UserCustomGroupId = ucg.Id)*1.0)/(100*1.0) 
        ELSE 1 
        END 
        ) 
       ) 
       As amount 
       FROM Packs WHERE Id IN (
       SELECT ap.Id FROM Packs ap JOIN Users u ON ap.UserId = u.UserId 
       WHERE ap.MoneyToReturn > ap.MoneyReturned AND 
       u.Mass LIKE '1%'); 

正しい出力を生成しています。しかし、私はそれを適切に集約する方法を知らない。私は標準のGROUP BYを使用しようとしましたが、エラーが発生しました(列 'Packs.UserCustomGroupId'は集計関数またはGROUP BYのいずれのクラスにも含まれていないため選択リストに無効です)。何か案は?

sql output

私はユーザーIDで、それを集計したい:ここで私は、現在入手出力されます。前もって感謝します。

答えて

2

少なくともクエリの書き換えを必要とするオプションがそうのように、CTEまたは一時テーブルにあなたの既存のクエリをドロップすることです:

; with CTE as (MyQueryHere) 

Select UserID, sum(amount) 
from CTE 
Group by UserID 
+0

これは(広告されているように)最も簡単で簡単なアプローチですが、彼の最初のクエリはとても悪いので、書き直すのが良いと思います。 –

1

うわーそれはあなたがそこに行くんだ1つのクレイジークエリです。

はこれを試してみてください:

SELECT UserId, 
     0.099 * SUM(t.Amount) AS [Amount SUM] 
FROM Packs P 
JOIN Users U 
    ON P.UserID = U.UserID 
LEFT OUTER JOIN UserCustomGroups UCG 
    ON P.UserCustomGroupID = UCG.ID 
LEFT OUTER JOIN CustomGroups CG 
    ON UCG.CustomGroupID = CG.ID 
CROSS APPLY 
    (
     SELECT CASE WHEN CG.ID IS NULL 
      THEN 1 
      ELSE CG.AcceleratedProfitPercentage/100 
     END AS [Amount] 
    ) t 
WHERE P.MoneyToReturn > P.MoneyReturned 
AND U.Mass LIKE '1%' 
GROUP BY UserID 

まず、1により、任意の数を掛けることはかなり無意味です、まだ私はあなたのオリジナルのポストに二回、それを参照してください。私はそれが何につながったのかは分かりませんが、それは不要です。

また、CROSS APPLYを使用すると、サブクエリを繰り返す必要がなくなります。それは遅いです(返されるすべての行で実行されるので)しかし、私はそれがこの場合意味があると思います... CASEの代わりに左外部結合を使用する - SELECT - IS NULLは、より効率的で、 。

次に、SUMの割合を試しているようです。どのような種類のデータを返すかはわかりませんが、おそらくAVGが適切でしょうか?私はあなたがそれをやろうと考えている実用的な理由について考えることはできません。

最後に、APHの回答が最も確実に機能します(元のクエリが動作していると仮定します)。ただし、クエリの難読化と非効率性を考慮すると、間違いなく書き換えられます。

質問がある場合はお知らせください。

+1

1.0で乗算すると 'int'が' decimal'に変換されます - なぜそれが整数除算を避けるために使用しているのでしょうか?しかし、100.0で分けるのは簡単でしょう。 – APH

+0

それは正しい - 私はそれを実現するべきだった。しかし、それが意図であれば、明示的にキャストまたは変換する方が良いと思います。 –