在sql server中使用if-else(取消透视)

在sql server中使用if-else(取消透视),sql,sql-server,tsql,Sql,Sql Server,Tsql,我只想基于产品id运行一条sql语句: 如果产品id=0,则我要运行以下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'

我只想基于产品id运行一条sql语句:

如果产品id=0,则我要运行以下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
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
如果产品id为0,则我要运行以下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
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

区别在于第一个查询在where子句中不使用产品id,但第二个查询使用产品id。我在C应用程序中运行这些sql查询,因此产品id值是基于一些下拉框的参数

这里不需要两个不同的查询。您可以使用大小写表达式轻松地处理此问题。像这样的

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
在以下情况下使用isNull:

或者以这种方式使用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”时使用案例@ProductId,然后使用产品\u id else@ProductIdend@SqlZim是的,我想是的。哦,谢谢,我要试试这个,但在我这么做之前,我想告诉你,产品id并不总是固定的,它会随着下拉列表的改变而改变,所以我们需要像你在这里做的那样初始化产品id的值吗?@moe不,你不需要,但你需要将它作为一个参数传递。