2017-02-15 6 views
0

私は、製品IDに基づいてのみ、1つのSQL文を実行するSQLサーバーで使用して:私は、このSQL文を実行したい製品ID = 0の場合他の場合(アンピボット)

を:

SELECT QuarterName as Quarters, QuarterValue 
    FROM 
    (
     SELECT month_key, 
     sum(Q1)Q1, sum(Q2)Q2, sum(Q3)Q3, sum(Q4)Q4 
      FROM myTable 
      where line_item_id = '2548' 
      group by month_key 
      ) stu 
       UNPIVOT 
        (QuarterValue FOR QuarterName IN (Q1, Q2, Q3, Q4) 
        ) AS QTR 
         where month_key =2016 
> 0プロダクトID <もし

はその後、私は、このSQL文を実行したい:

SELECT QuarterName as Quarters, QuarterValue 
    FROM 
    (
     SELECT month_key, 
     sum(Q1)Q1, sum(Q2)Q2, sum(Q3)Q3, sum(Q4)Q4 
      FROM myTable 
      where line_item_id = '2548' 
      and product_id = 'wq2745' 
      group by month_key 
      ) stu 
       UNPIVOT 
        (QuarterValue FOR QuarterName IN (Q1, Q2, Q3, Q4) 
        ) AS QTR 
         where month_key =2016 

差が第1のクエリは、WHERE句でプロダクトIDを使用していないが、第二1が行うです。私はC#アプリケーションでこれらのSQLクエリを実行しているので、プロダクトID値はいくつかのドロップダウンボックスに基づいたパラメータとして来ています。

答えて

1

isnull(nullif())を使用する:

declare @ProductId varchar(6); 
    set @ProductId = 'wq2745' 

begin; 
    select 
     Quarters = QuarterName 
    , QuarterValue 
    from (
    select month_key 
    , sum(Q1) Q1 
    , sum(Q2) Q2 
    , sum(Q3) Q3 
    , sum(Q4) Q4 
    from myTable 
    where line_item_id = '2548' 
    and product_id = isnull(nullif(@ProductId,'0'),product_id) 
    group by month_key 
    ) stu 
    unpivot(QuarterValue for QuarterName in (Q1, Q2, Q3, Q4)) as QTR 
    where month_key = 2016 
end; 

またはIfと二つの文を使用して、この方法:

declare @ProductId varchar(6); 
    set @ProductId = 'wq2745' 

if @ProductId = '0' 
begin; 
    select 
     Quarters = QuarterName 
    , QuarterValue 
    from (
    select month_key 
    , sum(Q1) Q1 
    , sum(Q2) Q2 
    , sum(Q3) Q3 
    , sum(Q4) Q4 
    from myTable 
    where line_item_id = '2548' 
    group by month_key 
    ) stu 
    unpivot(QuarterValue for QuarterName in (Q1, Q2, Q3, Q4)) as QTR 
    where month_key = 2016 
end; 

if @ProductId != '0' 
begin; 
    select QuarterName as Quarters 
    , QuarterValue 
    from (
    select month_key 
    , sum(Q1) Q1 
    , sum(Q2) Q2 
    , sum(Q3) Q3 
    , sum(Q4) Q4 
    from myTable 
    where line_item_id = '2548' 
    and product_id = @ProductId 
    group by month_key 
    ) stu 
    unpivot(QuarterValue for QuarterName in (Q1, Q2, Q3, Q4)) as QTR 
    where month_key = 2016 
end; 
+0

ありがとう、私はこれを試してみるつもりですが、私はそれを行う前に、製品IDが常に固定ではないことを伝えたいと思います。ドロップダウンが変更されたときに変更されるので、製品IDの値を初期化する必要がありますあなたはここでやった? – moe

+0

@moeそうではありませんが、パラメータとして渡す必要があります。 – SqlZim

0

ここでは2つの異なるクエリは必要ありません。あなたは簡単にcase式でこれを扱うことができます。このようなもの。

SELECT QuarterName as Quarters, QuarterValue 
    FROM 
    (
     SELECT month_key, 
     sum(Q1)Q1, sum(Q2)Q2, sum(Q3)Q3, sum(Q4)Q4 
      FROM myTable 
      where line_item_id = '2548' 
      and product_id = case @ProductId when <> 0 then 'wq2745' else product_id end 
      group by month_key 
      ) stu 
       UNPIVOT 
        (QuarterValue FOR QuarterName IN (Q1, Q2, Q3, Q4) 
        ) AS QTR 
         where month_key =2016 
+0

あなた 'case'式が他の方法で回避すべきではありませんか? 'case @ProductId '0' then product_id else @ProductId end' – SqlZim

+0

@SqlZimはいそうだと思います。おっとっと。 –