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
我有以下 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