2016-10-20 3 views
0

私は数日間作業しているという質問があります。この質問のおかげでSQL SERVER T-SQL Calculate SubTotal and Total by group私は小計と合計を得ることができました。SQLでグループを無視するすべての行数を加算する

このデータがカスタムアプリケーション(私が制御できないアプリケーション)に返されると、ID列によって返されたデータがORDER BY句を無視して並べ替えられます。私はカウンターにかかわらず、行がで発見されたものをグループの発見されたすべての単一の行に対して1ずつインクリメントされるように、私のTSQLにダムのカウントを追加するこの問題を解決するために

私のコードはようです続く。

select ID as ID, EstRefNum as "Estimate No", 
     (case when GROUPING(Ordered) = 0 and 
     GROUPING(Ref1) = 0 and 
     GROUPING(ID) = 1 
     then 
       case when Ref1 IS NULL 
       then 'No BDM Sub Total' 
       else Ref1 + ' Sub Total' 
       end 
     when GROUPING(Ordered) = 0 and 
     GROUPING(Ref1) = 1 and 
     GROUPING(ID) = 1 
     then 
       CASE 
       WHEN Ordered = 0 THEN 'Not Ordered Sub Total' 
       WHEN Ordered = 1 THEN 'Ordered Sub Total' 
       WHEN Ordered = 2 THEN 'Superseded Sub Total' 
       WHEN Ordered = 4 THEN 'Won/Convert Sub Total' 
       WHEN Ordered = 5 THEN 'Lost Sub Total' 
       WHEN Ordered IS NULL THEN 'None Sub Total' 
       ELSE 'Unknown status code' 
       END 
     when GROUPING(Ordered) = 1 and 
     GROUPING(Ref1) = 1 and 
     GROUPING(ID) = 1 
     then 
       'Total' 
     else 
       case 
       when Ref1 IS NULL 
       then 'No BDM' 
       else Ref1 
       end 
    end) as "Sales Rep", 
    [mo].[EstimateDate] as "Estimate Date", 
    [mo].[CustomerRef] as "Customer", 
    [mo].[JobDescription] as "Title", 
    cast(Format([mo].[OtherTotal], 'N', 'en-us') as varchar(30)) as "Estimate total", 
    [mo].[TotalTotal] as "Sales", 
    [mo].[PaperSubTot] + [mo].[OriginMatSubTot] + [mo].[OtherMatSubTotal] + [mo].[OutworkSubtot] as "Direct Costs", 
    [mo].[TotalTotal] - ([mo].[PaperSubTot] + [mo].[OriginMatSubTot] + [mo].[OtherMatSubTotal] + [mo].[OutworkSubtot]) as "Value Added", 
    ([mo].[OriginLabLabSubTot] + [mo].[PrintingSubTotal] + [mo].[FinishingSubTotal]) as "Overheads", 
    ([mo].[TotalTotal] - ([mo].[PaperSubTot] + [mo].[OriginMatSubTot] + [mo].[OtherMatSubTotal] + [mo].[OutworkSubtot])) - ([mo].[OriginLabLabSubTot] + [mo].[PrintingSubTotal] + [mo].[FinishingSubTotal]) as "Profit", 
    sum(TotalTotal) as SubTotal, 
     CASE 
     WHEN [mo].[OtherTotal] = 0.000000 THEN '0.00' 
     WHEN [mo].[OtherTotal] = .00 THEN '0.00' 
     WHEN [mo].[OtherTotal] = 0.00 THEN '0.00' 
     ELSE LTRIM(Str(CAST([mo].[OtherTotal] as decimal(18,2)), 25, 2)) 
     END AS 'CASE EST TOTAL', 
     CASE 
     WHEN Ordered = 0 THEN 'Not Ordered' 
     WHEN Ordered = 1 THEN 'Ordered' 
     WHEN Ordered = 2 THEN 'Superseded' 
     WHEN Ordered = 4 THEN 'Won/Convert' 
     WHEN Ordered = 5 THEN 'Lost' 
     WHEN Ordered IS NULL THEN 'None' 
     ELSE 'Unknown status code' 
     END AS 'Estimate Status' 

From [dbo].[MainEstimateDetails] [mo] WITH (NOLOCK) 

WHERE 
[mo].[Ref1] LIKE 'STAFF MEMBER NAME' 

group by grouping sets((Ordered, Ref1, ID, EstRefNum,EstimateDate, CustomerRef, JobDescription, OtherTotal, TotalTotal, PaperSubTot, OriginMatSubTot, OtherMatSubTotal, OutworkSubtot, OriginLabLabSubTot, PrintingSubTotal, FinishingSubTotal), 
        (Ordered, Ref1), 
        ()      
       ) 

order by 'Estimate Status' Desc; 

以下のようにデータを返します。

What i get

What i want

どのように私は、返された行は、コマンドでグループを無視してカウントし得るのですか?次のように私が欲しいのは、左側のカウントですか私は首尾よく各グループ内のアイテムの数を得ることに成功しましたが、私は何を探していません。変数を操作して、selectステートメントによって作成されたデータベースを通して各ループで1つずつインクリメントされるようにする方法はありません。

私は必要なものに近い質問と答えを見つけましたが、銀色の弾丸に見えるものは何も見つかりませんでした。

おかげ

+1

必要なものはすべてROW_NUMBERです。注文として使用する列を決定するだけです。 https://msdn.microsoft.com/en-us/library/ms186734.aspx order by句は、列エイリアスではなく文字列リテラルによって順序付けされているため、無意味です。つまり、あなたは命令を出すつもりだが、あなたは何が分からないのか。あなたはまた、NOLOCKをどこにでも散らばっていないと考えるかもしれません。ほとんどの人が気付くよりははるかに邪悪です。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

+0

NO LOCKに関する情報をありがとうございます。その部分は私がやったことではありませんでしたが、データベースとのやりとりのためのデフォルトのベースコードを作成した人たちはそうしました。私はそれを削除し、結果が何であるか見ることができます! – user202944

答えて

1

コメントが言ったようにディーンは、あなただけの以下のようなROW_NUMBER列を追加する必要があります。各行の整数が増えます。

select ID as ID, EstRefNum as "Estimate No", 
     (case when GROUPING(Ordered) = 0 and 
     GROUPING(Ref1) = 0 and 
     GROUPING(ID) = 1 
     then 
       case when Ref1 IS NULL 
       then 'No BDM Sub Total' 
       else Ref1 + ' Sub Total' 
       end 
     when GROUPING(Ordered) = 0 and 
     GROUPING(Ref1) = 1 and 
     GROUPING(ID) = 1 
     then 
       CASE 
       WHEN Ordered = 0 THEN 'Not Ordered Sub Total' 
       WHEN Ordered = 1 THEN 'Ordered Sub Total' 
       WHEN Ordered = 2 THEN 'Superseded Sub Total' 
       WHEN Ordered = 4 THEN 'Won/Convert Sub Total' 
       WHEN Ordered = 5 THEN 'Lost Sub Total' 
       WHEN Ordered IS NULL THEN 'None Sub Total' 
       ELSE 'Unknown status code' 
       END 
     when GROUPING(Ordered) = 1 and 
     GROUPING(Ref1) = 1 and 
     GROUPING(ID) = 1 
     then 
       'Total' 
     else 
       case 
       when Ref1 IS NULL 
       then 'No BDM' 
       else Ref1 
       end 
    end) as "Sales Rep", 
    [mo].[EstimateDate] as "Estimate Date", 
    [mo].[CustomerRef] as "Customer", 
    [mo].[JobDescription] as "Title", 
    cast(Format([mo].[OtherTotal], 'N', 'en-us') as varchar(30)) as "Estimate total", 
    [mo].[TotalTotal] as "Sales", 
    [mo].[PaperSubTot] + [mo].[OriginMatSubTot] + [mo].[OtherMatSubTotal] + [mo].[OutworkSubtot] as "Direct Costs", 
    [mo].[TotalTotal] - ([mo].[PaperSubTot] + [mo].[OriginMatSubTot] + [mo].[OtherMatSubTotal] + [mo].[OutworkSubtot]) as "Value Added", 
    ([mo].[OriginLabLabSubTot] + [mo].[PrintingSubTotal] + [mo].[FinishingSubTotal]) as "Overheads", 
    ([mo].[TotalTotal] - ([mo].[PaperSubTot] + [mo].[OriginMatSubTot] + [mo].[OtherMatSubTotal] + [mo].[OutworkSubtot])) - ([mo].[OriginLabLabSubTot] + [mo].[PrintingSubTotal] + [mo].[FinishingSubTotal]) as "Profit", 
    sum(TotalTotal) as SubTotal, 
     CASE 
     WHEN [mo].[OtherTotal] = 0.000000 THEN '0.00' 
     WHEN [mo].[OtherTotal] = .00 THEN '0.00' 
     WHEN [mo].[OtherTotal] = 0.00 THEN '0.00' 
     ELSE LTRIM(Str(CAST([mo].[OtherTotal] as decimal(18,2)), 25, 2)) 
     END AS 'CASE EST TOTAL', 
     CASE 
     WHEN Ordered = 0 THEN 'Not Ordered' 
     WHEN Ordered = 1 THEN 'Ordered' 
     WHEN Ordered = 2 THEN 'Superseded' 
     WHEN Ordered = 4 THEN 'Won/Convert' 
     WHEN Ordered = 5 THEN 'Lost' 
     WHEN Ordered IS NULL THEN 'None' 
     ELSE 'Unknown status code' 
     END AS 'Estimate Status', 

ROW_NUMBER() OVER(ORDER BY CASE 
     WHEN Ordered = 0 THEN 'Not Ordered' 
     WHEN Ordered = 1 THEN 'Ordered' 
     WHEN Ordered = 2 THEN 'Superseded' 
     WHEN Ordered = 4 THEN 'Won/Convert' 
     WHEN Ordered = 5 THEN 'Lost' 
     WHEN Ordered IS NULL THEN 'None' 
     ELSE 'Unknown status code' 
     END) AS RowID 
From [dbo].[MainEstimateDetails] [mo] WITH (NOLOCK) 

WHERE 
[mo].[Ref1] LIKE 'STAFF MEMBER NAME' 

group by grouping sets((Ordered, Ref1, ID, EstRefNum,EstimateDate, CustomerRef, JobDescription, OtherTotal, TotalTotal, PaperSubTot, OriginMatSubTot, OtherMatSubTotal, OutworkSubtot, OriginLabLabSubTot, PrintingSubTotal, FinishingSubTotal), 
        (Ordered, Ref1), 
        ()      
       ) 

order by 'Estimate Status' Desc; 
+0

絶対完璧です、ありがとうございます。それは私が一日の最高の部分を探していた正確なことでした!今、最初の金額ではなく最終金額として最終的な金額を得る方法を考えて、私は設定されています:D – user202944

関連する問題