私は数日間作業しているという質問があります。この質問のおかげで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;
以下のようにデータを返します。
どのように私は、返された行は、コマンドでグループを無視してカウントし得るのですか?次のように私が欲しいのは、左側のカウントですか私は首尾よく各グループ内のアイテムの数を得ることに成功しましたが、私は何を探していません。変数を操作して、selectステートメントによって作成されたデータベースを通して各ループで1つずつインクリメントされるようにする方法はありません。
私は必要なものに近い質問と答えを見つけましたが、銀色の弾丸に見えるものは何も見つかりませんでした。
おかげ
必要なものはすべてROW_NUMBERです。注文として使用する列を決定するだけです。 https://msdn.microsoft.com/en-us/library/ms186734.aspx order by句は、列エイリアスではなく文字列リテラルによって順序付けされているため、無意味です。つまり、あなたは命令を出すつもりだが、あなたは何が分からないのか。あなたはまた、NOLOCKをどこにでも散らばっていないと考えるかもしれません。ほとんどの人が気付くよりははるかに邪悪です。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –
NO LOCKに関する情報をありがとうございます。その部分は私がやったことではありませんでしたが、データベースとのやりとりのためのデフォルトのベースコードを作成した人たちはそうしました。私はそれを削除し、結果が何であるか見ることができます! – user202944