Select 中的 Where 子句 - SQL

Where clause within Select - TSQL

我有以下 T-SQL 代码,正在 SQL Server 2014 中使用。

    SELECT s.[CusNo] Supplier, 
RTRIM(CAST(s.[Customer] AS VARCHAR(50)) ) AS Name,


    sum(case when s.Date 
        BETWEEN CASE 
            WHEN    GETDATE() <= DATEADD(Day,-0,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01'))
            THEN    DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE())-1)) + '-02-01'))
            ELSE    DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01'))
        END 
        AND
        CASE 
            WHEN    GETDATE() = DATEADD(Day,-0,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01'))
            THEN    DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01'))
            ELSE    Convert(date, dateadd(wk, datediff(wk, 0, GETDATE()) - 1, 0) + 5)
        END
           then s.SELLINC else 0 end) YrToDateActual

FROM [dbo].[CustomerReports] s
WHERE s.BRN = 1 or s.BRN = 2 or s.BRN = 3 or s.BRN = 4 or s.BRN = 5  or s.SELLINC is null or s.SELLINC = '0'
GROUP BY s.[CusNo], s.[Customer]

在上面的 TSQL 代码中我使用了 where 子句
(s.BRN = 1 or s.BRN = 2 or s.BRN = 3 or s.BRN = 4 or s.BRN = 5) ,

因此我得到了以下结果,

Supplier    Name               YTDA(12345)
2           A C Limited        10
13          A Co Ltd           20
24          A Worth            30

我正在努力实现以下答案,

YTDA(12345)= where (s.BRN = 1 or s.BRN = 2 or s.BRN = 3 or s.BRN = 4 or s.BRN = 5)
YTDA(1)= where (s.BRN = 1)

YTDA(2)= where (s.BRN = 2)

YTDA(3)= where (s.BRN = 3)

YTDA(4)= where (s.BRN = 4)

YTDA(5)= where (s.BRN = 5)

所以我期待这样的输出,

Supplier Name       YTDA(12345) YTDA(1) YTDA(2) YYTDA(3) YTDA(4) YTDA(5)     
    2    A C Limited    10          10      10      10       10      10
    13   A Co Ltd       20          20      20      20       20      20
    24  A W worth       30          30      30      30       30      30

请问T-SQL代码是什么?

将where子句放入求和内的CASE中。 例如,这应该只是 s.BRN = 1

的细分
SELECT s.[CusNo] Supplier, 
   RTRIM(CAST(s.[Customer] AS VARCHAR(50)) ) AS Name,
   sum(
CASE WHEN s.BRN = 1
THEN
   case when s.Date  BETWEEN CASE 
   WHEN   GETDATE() <= DATEADD(Day,-0,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01'))
   THEN    DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4),(year(GETDATE())-1)) + '-02-01'))
   ELSE    DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01'))
   END 
   AND
   CASE 
   WHEN    GETDATE() = DATEADD(Day,-0,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01'))
   THEN    DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01'))
   ELSE    Convert(date, dateadd(wk, datediff(wk, 0, GETDATE()) - 1, 0) + 5)
   END
   then s.SELLINC else 0 end
ELSE 0  END ) YTDA(1)
   FROM [dbo].[CustomerReports] s
   WHERE s.BRN = 1 or s.BRN = 2 or s.BRN = 3 or s.BRN = 4 or s.BRN = 5  or s.SELLINC is null or s.SELLINC = '0'
   GROUP BY s.[CusNo], s.[Customer]

也许还有其他方法可以满足这种需求,

不过我的是这样的,要看你想要的结果了

declare @SumFun varchar (1000), 
        @Query nvarchar (max)

set @SumFun = ' sum(
       case when s.Date  BETWEEN CASE 
       WHEN   GETDATE() <= DATEADD(Day,-0,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01'))
       THEN    DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4),(year(GETDATE())-1)) + '-02-01'))
       ELSE    DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01'))
       END 
       AND
       CASE 
       WHEN    GETDATE() = DATEADD(Day,-0,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01'))
       THEN    DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01'))
       ELSE    Convert(date, dateadd(wk, datediff(wk, 0, GETDATE()) - 1, 0) + 5)
       END
       then s.SELLINC else 0 end)'

set @Query = '
SELECT s.[CusNo] Supplier, 
       RTRIM(CAST(s.[Customer] AS VARCHAR(50)) ) AS Name, ' 
        + @SumFun  +
        ' YTDA(12345) , '
                + @SumFun  +
        ' YTDA(1) , '
                + @SumFun  +
        ' YTDA(2) , '
                + @SumFun  +
        ' YTDA(3) , '
                + @SumFun  +
        ' YTDA(4) , '
                + @SumFun  +
        ' YTDA(5)  ' + 
       'FROM [dbo].[CustomerReports] s
       WHERE s.BRN = 1 or s.BRN = 2 or s.BRN = 3 or s.BRN = 4 or s.BRN = 5  or s.SELLINC is null or s.SELLINC = '0'
       GROUP BY s.[CusNo], s.[Customer] '

exec sp_executesql @Query