2016-07-01 29 views
0

I持って次のクエリ:分割その値に基づいて2へのSQL列

declare 
     @PharmTransDateKey int 


set @PharmTransDateKey = 20160630 

select 
    ds.StoreName, 
    case when dro.NetCount < 0 then 'Previous Period Adj' 
     else 'Todays Sales' 
    end as Category, 
    sum(ClaimAmount) as ThirdPartyDue 
from 
    Final.FactRxBusinessEffectiveDay f 
     inner join Final.DimRxOutcome dro 
      on f.RxOutcomeKey = dro.RxOutcomeKey 
     inner join Final.DimStore ds 
      on ds.StoreKey = f.StoreKey and 
       ds.SourceChainKey = 254 
where 
    PharmTransDateKey = @PharmTransDateKey and 
    dro.NetCount <> 0 
group by 
    ds.StoreName, 
    case when dro.NetCount < 0 then 'Previous Period Adj' 
     else 'Todays Sales' 
    end 
order by 1,2,3 

この出力:

enter image description here

私は2つの値のみを使用したいですCategory列およびそれらに彼ら自身の列を作ります。以下の表は、私が撮影しているものです。

enter image description here

+1

あなたはどのようなDBMSを使用していますか? SQLサーバー? MySQL?オラクル?他に何か? – Siyual

答えて

1
declare @PharmTransDateKey int 
set @PharmTransDateKey = 20160630 

SELECT 
    ds.StoreName 
    ,SUM(CASE WHEN dro.NetCount < 0 THEN ClaimAmount ELSE 0 END) AS 'Previous Period Adj' 
    ,SUM(CASE WHEN dro.NetCount < 0 THEN 0 ELSE ClaimAmount END) AS 'Todays Sales' 
FROM 
    Final.FactRxBusinessEffectiveDay f 
    inner join Final.DimRxOutcome dro 
     on f.RxOutcomeKey = dro.RxOutcomeKey 
    inner join Final.DimStore ds 
     on ds.StoreKey = f.StoreKey and 
      ds.SourceChainKey = 254 
WHERE 
    PharmTransDateKey = @PharmTransDateKey and 
    dro.NetCount <> 0 
GROUP BY 
    ds.StoreName 

私はPIVOTを書かれているだろうが、本当にあなたがそのあなたができるクエリを旋回させることになりますただ、変更やSUM​​とあなたの答えはるかに簡単かつ迅速に取得します。あなたが表示しているものとあなたの最終的に望む結果との間に中間的な質問を持つ必要はありません。

1

あなたは別のエイリアスを使用して自身でテーブルを結合して、その値に基づいて列を分割することができます。

が販売を行うことができます

、あなたはフィールドshopId、DEPTとテーブルの販売を持って言う:

select 
    s1.shopId, 
    s1.dept, s1.sales grocery_sales, 
    s2.dept, s2.sales bakery_sales 
from 
    Sales s1, Sales s2 
where 
    s1.shopId = s2.shopId 
and s1.dept="grocery" 
and s2.dept="bakery" 
0

代わりに、次のようにフィールドを計算するクエリを調整します。

select 
    ds.StoreName, 
    sum(case when dro.NetCount < 0 then claimamount end) 'Previous Period Adj' 
    sum(case when dro.NetCount >= 0 then claimamount end) 'Todays Sales' 
from 
    Final.FactRxBusinessEffectiveDay f 
     inner join Final.DimRxOutcome dro 
      on f.RxOutcomeKey = dro.RxOutcomeKey 
     inner join Final.DimStore ds 
      on ds.StoreKey = f.StoreKey and 
       ds.SourceChainKey = 254 
where 
    PharmTransDateKey = @PharmTransDateKey and 
    dro.NetCount <> 0 
group by 
    ds.StoreName, 
order by 1 
+0

私が投稿したものと同じ.... – Matt

関連する問題