2016-10-24 20 views
0

あなたが提供してくれたすべての助けをくれてありがとうございました。残念ながら、私が探していた期待された結果が得られませんでした。私が探しているヘルプをより良く得るために、私が達成しようとしていることを説明しようとします。SQL ServerでSum(MAX)を計算しようとしています

"IN"、 "AA_Now"、 "STF_Now"、 "dbo.Sheet1 $ .LOB_name"、 "dbo.Sheet1 $ .LifeCycleName"、 "dbo.Sheet1 $ .AreaOfBusiness"の主な列は、 。各「IN」には「AA_Now」と「STF_Now」があります。 "IN"グループが "dbo.Sheet1 $ .LOB_name"の下にロールアップします。 "dbo.Sheet1 $ .LOB_name"の下で、私はちょうどロールアップされた "IN"のグループの最大値が必要です。現在、 "dbo.Sheet1 $ .LOB_name"は "dbo.Sheet1 $ .LifeCycleName"の下にロールアップされています。必要なのは、 "dbo.Sheet1 $ .LOB_name"の下にロールアップされた最大値の合計です。 "dbo.Sheet1 $。ライフサイクル名"のロールアップ。最後に "dbo.Sheet1 $。ライフサイクル名"は "dbo.Sheet1 $ .AreaOfBusiness"にロールアップされます。私が探しているものは、 "dbo.Sheet1 $ .LifeCycleName"の合計です。これらは "AA_Now"と "STF_Now"の列のみです 私はピボットテーブルからそれをやってみましたが役に立たず、生のデータで並べ替えるのが最善であると考えました。

私は実行できませんSUM(MAX)SQLサーバでの計算とメッセージ130コマンド

を実行するときに、フォローエラーを取得、レベル15、状態1、行6 を行うにしようとしています集約関数またはサブクエリを含む式に対する集計関数。私はエラーが両方

によって引き起こされていると確信している

、SUM(MAX(、([AA_Now]、 'N/A' に置き換え、(フロートを変換する '0')))) 【AA2_Now]

として、SUM(MAX(([STF_Now]、 'N/A' を置き換える、(フロートを変換する '0'))))

[STF2_Now]として

ですが、エラーを発生させることなく書き換える方法はわかりません。

以下は完全なコードです。

SELECT dbo.CCA_Merged.id, dbo.CCA_Merged.timeStamp, dbo.CCA_Merged.name, dbo.CCA_Merged.lN 
     ,dbo.CCA_Merged.type, dbo.CCA_Merged.id2, dbo.CCA_Merged.aG 
     ,dbo.CCA_Merged.regionId, dbo.CCA_Merged.sgcc  
     ,convert(float,replace([SLC_Today],'N/A','0')) As [SLC_Today] 
     ,convert(float,replace([AA_Now],'N/A','0')) As [AA_Now] 
     ,SUM(MAX(convert(float,replace([AA_Now],'N/A','0')))) As [AA2_Now] 
     ,convert(float,replace([SLCO_Today],'N/A','0')) As [SLCO_Today] 
     ,convert(float,replace([CABN_Today],'N/A','0')) As [CABN_Today] 
     ,convert(float,replace([COF_Today],'N/A','0')) As [COF_Today] 
     ,convert(float,replace([HT_Today],'N/A','0')) As [HT_Today] 
     ,convert(float,replace(replace([CH_Today],'N/A','0'),'-','0')) As [CH_Today] 
     ,convert(float,replace([SLC_Now],'N/A','0')) As [SLC_Now] 
     ,convert(float,replace([SLCO_Now],'N/A','0')) As [SLCO_Now] 
     ,convert(float,replace([SLC_Thirty],'N/A','0')) As [SLC_Thirty] 
     ,convert(float,replace(replace([SLCO_Thirty],'N/A','0'),'-','0')) As [SLCO_Thirty] 
     ,convert(float,replace([ACWT_Today],'N/A','0')) As [ACWT_Today] 
     ,convert(float,replace([CQ_Now],'N/A','0')) As [CQ_Now] 
     ,convert(float,replace([LCQ_Now],'N/A','0')) As [LCQ_Now] 
     ,convert(float,replace([SLCH_Now],'N/A','0')) As [SLCH_Now] 
     ,convert(float,replace([STF_Now],'N/A','0')) As [STF_Now] 
     ,SUM(MAX(convert(float,replace([STF_Now],'N/A','0')))) As [STF2_Now] 
     ,dbo.Sheet1$.AreaOfBusiness, dbo.Sheet1$.LifeCycleName, dbo.Sheet1$.LOB_name 
FROM   dbo.Sheet1$ RIGHT OUTER JOIN 
        dbo.CCA_Merged ON dbo.Sheet1$.Skill_Name = dbo.CCA_Merged.lN 
Group by ROLLUP (stf_now) ,dbo.CCA_Merged.id, dbo.CCA_Merged.timeStamp, dbo.CCA_Merged.name, dbo.CCA_Merged.lN 
      ,dbo.CCA_Merged.type, dbo.CCA_Merged.id2, dbo.CCA_Merged.aG ,dbo.CCA_Merged.regionId 
      ,dbo.CCA_Merged.sgcc,AA_Now,SLC_Today,SLCO_Today,CABN_Today,COF_Today,HT_Today,CH_Today 
      ,SLC_Now,SLCO_Now,SLC_Thirty,SLCO_Thirty,ACWT_Today,CQ_Now,LCQ_Now,SLCH_Now 
      ,dbo.Sheet1$.AreaOfBusiness, dbo.Sheet1$.LifeCycleName, dbo.Sheet1$.LOB_name 

私は比較的新しいSQL Serverを使用しており、どんな助けでも大歓迎です。予め

おかげ

スクリプト以下

SELECT dbo.CCA_Merged.lN  
    ,convert(float,replace([STF_Now],'N/A','0')) As [STF_Now] 
    ,dbo.Sheet1$.LOB_name, dbo.Sheet1$.LifeCycleName, dbo.Sheet1$.AreaOfBusiness 
FROM   dbo.Sheet1$ RIGHT OUTER JOIN 
       dbo.CCA_Merged ON dbo.Sheet1$.Skill_Name = dbo.CCA_Merged.lN     
Group by stf_now ,AA_Now,dbo.CCA_Merged.lN,dbo.Sheet1$.AreaOfBusiness, dbo.Sheet1$.LifeCycleName, dbo.Sheet1$.LOB_name 
Order by AreaOfBusiness DESC 
 
+----+---------+----------+---------------+----------------+ 
| LN | STF_Now | LOB_name | LifeCycleName | AreaOfBusiness | 
+----+---------+----------+---------------+----------------+ 
| A |  46 | BSW  | BS   | Business  | 
| B |  46 | BSW  | BS   | Business  | 
| C |  0 | BOSS  | BS   | Business  | 
| D |  112 | MSD  | BS   | Business  | 
| E |  112 | MSD  | BS   | Business  | 
| F |  42 | BHV  | BR   | Business  | 
| G |  23 | BCR  | BR   | Business  | 
| H |  23 | BHV  | BR   | Business  | 
| I |  55 | BSW2  | BS   | Business  | 
| J |  1 | BSW2  | BS   | Business  | 
| K |  46 | BSW  | BS   | Business  | 
| L |  112 | MSD  | BS   | Business  | 
| M |  112 | MSD  | BS   | Business  | 
| N |  57 | BSW  | BS   | Business  | 
| O |  0 | BOSS  | BS   | Business  | 
| P |  38 | MSD  | BS   | Business  | 
| Q |  38 | MSD  | BS   | Business  | 
| R |  19 | BHV  | BR   | Business  | 
| S |  0 | BCR  | BR   | Business  | 
| T |  19 | BHV  | BR   | Business  | 
| U |  2 | BSW  | BS   | Business  | 
| V |  1 | BSW  | BS   | Business  | 
| W |  57 | BSW  | BS   | Business  | 
| X |  38 | MSD  | BS   | Business  | 
| Y |  38 | MSD  | BS   | Business  | 
+----+---------+----------+---------------+----------------+ 

3で予想結果が

LOB_Name2(これは、LNから生じるSTF_Nowの最大である列を追加でストリッピング更新します)

 
57 BSW 
0 BOSS 
112 MSD 
42 BHV 
23 BCR 
55 BSW2 

LifeCycleName2(これはLOB_Name2のロールアップの最大の和である)

 
224 BS 
65 BR 

AreaOfBusiness2(これはLifeCycleName2のロールアップの和である)

 
289 Business 
+0

実際にサンプルデータと結果として必要なものを追加する必要があります。必要なものを見つけ出すことは実際には不可能です。 –

+0

こんにちはJamesZ私はいくつかのサンプルデータを追加しました。ありがとうございました – rasmac

答えて

1

あなたはsummaxできませんあなたが同じグループを持っているならば、それは何とか同じ金額になるからです。この架空のSQLは、各製品の最大コストを取得し、彼らが製品グループレベルにそれらを合計

select 
    product_group, 
    sum(max_cost) 
from 
(
    select 
    product, 
    product_group, 
    max(cost) as max_cost 
    from 
    orders 
    group by 
    product_group,product 
) X 
group by product_group 

:あなたは、おそらくのようなもの、で別のグループとの内側と外側の部分を持っている必要があります。あなたが実際に必要と思う唯一の方法ですsummax

+0

あなたの助けてくれてありがとうございますが、残念なことに悲しいことに、それは今私が探していたものです - 私は達成しようとしているものを明確にするために投稿を編集しました。 – rasmac

1

MAXの値をSUMに追加するには、別のクエリレベルを追加する必要があります。

考え方は1つの選択でMAXになり、次に外部クエリを使用して結果をSUMにします。以下の例ではAVGとMAXを使用していますが、集約関数を使用することができます。

SELECT 
    LocationID, 
    MaxAverageSalePriceByLocation=MAX(AvgerageSalePriceByUserLocation) 
FROM 
(
    SELECT 
     UserID, 
     AvgerageSalePriceByUserLocation=AVG(SalePrice) 
    FROM 
     MyTable 
    GROUP BY 
     UserID,LocationID 
)AS A 
GROUP BY 
    LocationID 
+0

あなたの助けてくれてありがとうが、残念なことに悲しいことに、それは私が探していたものであることが判明しました - 私は達成しようとしているものをより明確にするために投稿を編集しました。 – rasmac

1

あなたはすべての行Max値を合計したい場合、あなたはすべての行グループごとにMax値を合計したい場合は、OVER(Partition by)

Sum(Max(CONVERT(FLOAT, Replace([STF_Now], 'N/A', '0'))))OVER(partition by grp1,grp2,..) AS [STF2_Now] 

を使用OVER()

Sum(Max(CONVERT(FLOAT, Replace([STF_Now], 'N/A', '0'))))OVER() AS [STF2_Now] 

を使用数値データをfloatに変換するとアプリにつながる可能性があります近似の問題。数値と精度と位取りを使用する

+0

あなたの助けていただきありがとうございますが、残念ながら悲しいことに、私が探していたことが判明しました。私は達成しようとしていることをより明確にするために投稿を編集しました。私はOVER()の考え方が好きで、将来的にはそれをもっと見ています。お返事ありがとうございます – rasmac

1

2つのネストされた集計を実行しようとしているので問題があります。 SUM(MAX)が実際にあなたがしようとしているものであれば、これはあなたの後ろのものをおおまかに示します。

しかし、Jamesが指摘したように、これを組み合わせるロジックによってグループが必要になります。

SELECT ... 
, SUM(AA2_Now_Max) 
... 
, SUM(STF2_Now_Max) 
FROM(
SELECT dbo.CCA_Merged.id, dbo.CCA_Merged.timeStamp, dbo.CCA_Merged.name, dbo.CCA_Merged.lN 
    ,dbo.CCA_Merged.type, dbo.CCA_Merged.id2, dbo.CCA_Merged.aG 
    ,dbo.CCA_Merged.regionId, dbo.CCA_Merged.sgcc  
    ,convert(float,replace([SLC_Today],'N/A','0')) As [SLC_Today] 
    ,convert(float,replace([AA_Now],'N/A','0')) As [AA_Now] 
    ,MAX(convert(float,replace([AA_Now],'N/A','0'))) As [AA2_Now_Max] 
    ,convert(float,replace([SLCO_Today],'N/A','0')) As [SLCO_Today] 
    ,convert(float,replace([CABN_Today],'N/A','0')) As [CABN_Today] 
    ,convert(float,replace([COF_Today],'N/A','0')) As [COF_Today] 
    ,convert(float,replace([HT_Today],'N/A','0')) As [HT_Today] 
    ,convert(float,replace(replace([CH_Today],'N/A','0'),'-','0')) As [CH_Today] 
    ,convert(float,replace([SLC_Now],'N/A','0')) As [SLC_Now] 
    ,convert(float,replace([SLCO_Now],'N/A','0')) As [SLCO_Now] 
    ,convert(float,replace([SLC_Thirty],'N/A','0')) As [SLC_Thirty] 
    ,convert(float,replace(replace([SLCO_Thirty],'N/A','0'),'-','0')) As [SLCO_Thirty] 
    ,convert(float,replace([ACWT_Today],'N/A','0')) As [ACWT_Today] 
    ,convert(float,replace([CQ_Now],'N/A','0')) As [CQ_Now] 
    ,convert(float,replace([LCQ_Now],'N/A','0')) As [LCQ_Now] 
    ,convert(float,replace([SLCH_Now],'N/A','0')) As [SLCH_Now] 
    ,convert(float,replace([STF_Now],'N/A','0')) As [STF_Now] 
    ,MAX(convert(float,replace([STF_Now],'N/A','0'))) As [STF2_Now_Max] 
    ,dbo.Sheet1$.AreaOfBusiness, dbo.Sheet1$.LifeCycleName, dbo.Sheet1$.LOB_name  
FROM   dbo.Sheet1$ RIGHT OUTER JOIN 
       dbo.CCA_Merged ON dbo.Sheet1$.Skill_Name = dbo.CCA_Merged.lN 
Group by ROLLUP (stf_now) ,dbo.CCA_Merged.id, dbo.CCA_Merged.timeStamp, dbo.CCA_Merged.name, dbo.CCA_Merged.lN 
     ,dbo.CCA_Merged.type, dbo.CCA_Merged.id2, dbo.CCA_Merged.aG ,dbo.CCA_Merged.regionId 
     ,dbo.CCA_Merged.sgcc,AA_Now,SLC_Today,SLCO_Today,CABN_Today,COF_Today,HT_Today,CH_Today 
     ,SLC_Now,SLCO_Now,SLC_Thirty,SLCO_Thirty,ACWT_Today,CQ_Now,LCQ_Now,SLCH_Now 
     ,dbo.Sheet1$.AreaOfBusiness, dbo.Sheet1$.LifeCycleName, dbo.Sheet1$.LOB_name) x 
GROUP BY ... 

この他の質問はパターンに似ています! SQL: SUM the MAX values of results returned

+0

あなたの助けてくれてありがとうございますが残念ながらそれは今私が探していたものです - 私は達成しようとしているものを明確にするために投稿を編集しました。 – rasmac

関連する問題