2016-03-26 5 views
0

私の結果を、0-33%、34-66%、67-100%の3つのグループにグループ分けする方法を見つけようとしています。計算はすでに「空乏」として設定されています。この列の上、中、下を3つの異なるグループにグループ化したいと思います。ここで私は複数のテーブルから使用しているクエリです。MSSQLグループパーセンテージ

私はパーセンテージを計算できるように、最初にSELECTの中で最高の値を見つけ出す必要があると仮定しますが、それを行う方法は見つからないようです。そこから、%に基づいて項目をグループ化する方法はわかりません。

SELECT  l.name AS Location, i.name AS ItemName, li.par, COUNT(*) AS Sales, li.par - COUNT(*) AS Depletion 
FROM   shoppingcartdetail AS o INNER JOIN 
        item AS i ON i.id = o.itemid INNER JOIN 
        location AS l ON o.locationid = l.id INNER JOIN 
        location_item AS li ON i.id = li.itemid 
WHERE  (CONVERT(datetime, o.created_date_time, 101) BETWEEN GETDATE() - l.service_interval AND GETDATE()) AND (o.locationid = 1) 
GROUP BY i.barcode, i.name, l.name, li.par 

サンプル結果M & Mのピーナッツ1.74オンスにより52項目の最高枯渇と100%のしきい値が新しいカラムを三つのグループに分類されることになるであろう

ItemName     | avgshelflife | unitcost | par | Sales | Depletion 
Dr. Pepper Bottle 20 oz | 90   | 0.83  | 70 | 31 | 39 
Mountain Dew Bottle 20 oz| NULL   |NULL  | 70 | 27 | 43 
Coke Can 12 oz   | NULL   |NULL  | 30 | 22 | 8 
M&M's Peanut 1.74 oz  | 90   | 0.60  | 66 | 14 | 52 
Dr. Pepper Can 12 oz  | 180   | 0.38  | 30 | 13 | 17 

を加えます。この場合

:Y =%* 52(M & Mのピーナッツ1.74オンスの枯渇)

Group0-30% is 0-17 
Group31-66% is 18-34 
Group66-100% is 35-52 

結果、事前に

Group0-30% Coke Can 12 oz 
Group31-66% Dr. Pepper Can 12 oz 
Group66-100% Dr. Pepper Bottle 20 oz, Mountain Dew Bottle 20 oz, M&M's Peanut 1.74 oz 

ありがとう!

+0

することができますサンプルを追加するaと疑問の予期した結果 –

答えて

1

私はあなたの質問を理解しているので、グループ内に表示する必要があるパーセンテージである「枯渇」を表示したいと思います。これなら、このように使うことができます。

select *,CASE 
    WHEN (Depletion < 34) THEN 
     'Group0-30%' + ItemName 
    ELSE 
     CASE 
      WHEN (Depletion < 67) THEN 
       'Group31-66%' + ItemName 
      ELSE 
       'Group66-100%' + ItemName 
     END 
    END from (
     SELECT  l.name AS Location, i.name AS ItemName, li.par, COUNT(*) AS Sales, li.par - COUNT(*) AS Depletion 
     FROM   shoppingcartdetail AS o INNER JOIN 
          item AS i ON i.id = o.itemid INNER JOIN 
          location AS l ON o.locationid = l.id INNER JOIN 
          location_item AS li ON i.id = li.itemid 
     WHERE  (CONVERT(datetime, o.created_date_time, 101) BETWEEN GETDATE() - l.service_interval AND GETDATE()) AND (o.locationid = 1) 
     GROUP BY i.barcode, i.name, l.name, li.par) t 

そうでない場合は、理解しやすいようにデータを提供してください。

おかげで、

+0

今は枯渇のレベルを計算しているだけです。それは現在実行中に混乱している他の部分であるパー​​センテージではありません。私はオリジナルの投稿を編集しましたが、明確にするために、最も高い枯渇を見つけてそれを100%のしきい値として設定してから計算する必要があります。 – user963091

+0

私の投稿を編集しました...これはあなたに役立つかどうかわからないが、私はあなたにそれを完璧にしようとした。それが有用であるかどうかをチェックし、示唆してください。 –

+0

これは私が必要とするものです。私が理解できない唯一のことは、DepletionカラムでMAXを見つけて100%マーカとして使用することです。今、枯渇はパーセントではありません。 – user963091

0

これは(ただし醜い)作品、アイデアはトップパーセントを使用し、残りを行うことです、私はデモの目的のためにsales.ordersテーブルを使用していますが、考え方は同じまま..

STEP1:私が原因アイデンティティCOLと怠惰に三つの異なる一時テーブルを使用していた3つの一時テーブルにすべての割合を取得し、あなたが1

select top 33 percent * ,'37 pcnt' as 'pcnt' into #temp1 from sales.orders order by orderdate desc 

select top 67percent * ,'67 pcnt' as 'pcnt' into #temp2 from sales.orders order by orderdate desc 

select * ,'100 pcnt' as 'pcnt' into #temp3 from sales.orders 

でそれを行うことができ、今、次のステップは、我々はデータを取得する場所です..

with cte 
as 
(
select * from #temp 
union all 
select * from 
(
select * from #temp1 t1 where not exists(select 1 from #temp t2 where t2.orderid=t1.orderid) 
)c 

) 
select * from cte 
union all 
select * from 
(
select * from #temp3 t3 where not exists(select 1 from cte where cte.orderid=t3.orderid) 
)b 

出力: enter image description here

0

ます。また、行number..belowに基づくパーセントを計算する関数を宣言する可能性が論理、あなたは注意することは、あなたのneeds..furtherポイントごとに洗練することができますいくつかあります

受注が私のデモでPK ..です行はゼロパーセントを言うかもしれませんが、返された行は、トップパーセント句でインラインである、あなたは、あなたの場合にはそれに固有の番号やPKを変更することができます

Alter function dbo.getpercent 
(@orderid as int 
) 
returns int 
as 
begin 

declare @pcnt int 
;with cte 
as 
(
select row_number() over (order by orderid) as rn,orderid 
from sales.orders) 
select @pcnt=(cast(rn as float)/830)*100 from cte 
where [email protected] 

return @pcnt 
end 

select dbo.getpercent(orderid) ,* from sales.orders 
order by orderid