Chcę uruchomić tylko jedno oświadczenie SQL na podstawie ID produktu:

Jeśli Identyfikator produktu = 0, chcę uruchomić tę instrukcję 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' 
            group by month_key 
            ) stu
                 UNPIVOT
                    (QuarterValue FOR QuarterName IN (Q1, Q2, Q3, Q4)
                     ) AS QTR 
                        where month_key =2016

Jeśli identyfikator produktu <> 0, chcę uruchomić tę instrukcję 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

Różnica to pierwsze zapytanie nie używa identyfikatora produktu w klauzuli gdzie, ale drugi. Uruchamiam te zapytania SQL w aplikacji C #, więc wartość ID produktu przychodzi jako parametry oparte na niektórych rozwijanych pudełkach.

0
moe 15 luty 2017, 23:30

2 odpowiedzi

Najlepsza odpowiedź

Używanie 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;

Lub przy użyciu If i dwóch stwierdzeń w ten sposób:

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;
1
SqlZim 15 luty 2017, 20:37

Nie potrzebujesz dwóch różnych zapytań tutaj. Możesz łatwo sobie z tym poradzić z wyrażeniem sprawy. Coś takiego.

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
Sean Lange 15 luty 2017, 21:06