Sql server 若要在上的左连接后不为null,将删除由null扩展的任何行,即只在行上保留内部连接,即“将外部连接转换为内部连接”。始终知道作为左联接的一部分,您需要什么样的内部联接。@JasperS3000我无法获得参数1(值为0.5)的预期结果。使用您当前的数据和业
Sql server 若要在上的左连接后不为null,将删除由null扩展的任何行,即只在行上保留内部连接,即“将外部连接转换为内部连接”。始终知道作为左联接的一部分,您需要什么样的内部联接。@JasperS3000我无法获得参数1(值为0.5)的预期结果。使用您当前的数据和业,sql-server,where,self-join,ambiguity,Sql Server,Where,Self Join,Ambiguity,若要在上的左连接后不为null,将删除由null扩展的任何行,即只在行上保留内部连接,即“将外部连接转换为内部连接”。始终知道作为左联接的一部分,您需要什么样的内部联接。@JasperS3000我无法获得参数1(值为0.5)的预期结果。使用您当前的数据和业务逻辑,您可以将记录分解为0.5吗?@EzLo输入参数1指示,在tblAnimals表中,只有总共有1个“怪癖”的行都被考虑了。这样的行有4行。那应该成为我们的分母。为了建立分子,我们现在查看tblJobEntries表,检查与分母中的行共享相
若要在上的左连接后不为null,将删除由null扩展的任何行,即只在行上保留内部连接,即“将外部连接转换为内部连接”。始终知道作为左联接的一部分,您需要什么样的内部联接。@JasperS3000我无法获得参数1(值为0.5)的预期结果。使用您当前的数据和业务逻辑,您可以将记录分解为0.5吗?@EzLo输入参数1指示,在tblAnimals表中,只有总共有1个“怪癖”的行都被考虑了。这样的行有4行。那应该成为我们的分母。为了建立分子,我们现在查看tblJobEntries表,检查与分母中的行共享相同日期的行(刚刚建立的),并计算至少一个CASE语句产生大于0盈余的相同日期分子行的数量。有两行这样的行,所以我们剩下的分子是2,分母是4,十进制形式等于。5。浮点数据类型的更改非常重要。但是,您的Select语句产生错误的结果,因为根据我对该测试数据的手动计算,分母仍然没有拾取a.Quirks所期望的过滤器
Input Parameter Correct Output Parameter
0 0
1 .5
2 .666
3 .666
--This is a user defined function containing 2 CTE's and a SELECT
--statement with 2 joins and a WHERE clause. I included that structural
--detail in case it makes a difference.
CREATE FUNCTION [dbo].[ExampleOfQueryStructure]
(
@MyInputParameter int
)
RETURNS
@MyOutputParameter TABLE
(
[MyPercentage] float
)
AS
BEGIN
WITH Quirks_CTE (AnimalDateTime, Quirks)
AS
(SELECT
AnimalDateTime,
(COALESCE (Lion, 0) + COALESCE (Zebra, 0)
+ COALESCE (Antelope, 0) + COALESCE (Giraffe, 0))
FROM dbo.tblAnimals),
Surplus_CTE
AS
(SELECT
JobEntryDateTime,
CASE
WHEN tblJobEntries.Stance = 1
THEN ExitLevel5-BeginLevel
ELSE BeginLevel-ExitLevel5
END AS [5_SURPLUS],
CASE
WHEN tblJobEntries.Stance = 1
THEN ExitLevel8-BeginLevel
ELSE BeginLevel-ExitLevel8
END AS [8_SURPLUS],
CASE
WHEN tblJobEntries.Stance = 1
THEN ExitLevel20-BeginLevel
ELSE BeginLevel-ExitLevel20
END AS [20_SURPLUS],
CASE
WHEN tblJobEntries.Stance = 1
THEN ExitLevelStone-BeginLevel
ELSE BeginLevel-ExitLevelStone
END AS [StoneProfit]
FROM dbo.tblJobEntries)
INSERT INTO @MyOutputParameter ([MyPercentage])
SELECT
COUNT(a.Quirks)/COUNT(b.Quirks)
FROM QuirksCTE b
LEFT OUTER JOIN QuirksCTE a
ON b.AnimalDateTime = a.AnimalDateTime
where exists(select 1 from Surplus_CTE c
where a.AnimalDateTime = c.JobEntryDateTime
AND ([5_SURPLUS] > 0 OR [8_SURPLUS] > 0
OR [20_SURPLUS] > 0 OR [StoneProfit] > 0)
AND a.Quirks <= @MyInputParameter)
RETURN
END
CREATE FUNCTION [dbo].[ExampleOfQueryStructure]
(
@MyInputParameter int
)
RETURNS
@MyOutputParameter TABLE
(
[MyPercentage] float
)
AS
BEGIN
WITH Quirks_CTE (AnimalDateTime, Quirks)
AS
(SELECT
AnimalDateTime,
(COALESCE (Lion, 0) + COALESCE (Zebra, 0)
+ COALESCE (Antelope, 0) + COALESCE (Giraffe, 0))
FROM dbo.tblAnimals),
Surplus_CTE
AS
(SELECT
JobEntryDateTime,
CASE
WHEN tblJobEntries.Stance = 1
THEN ExitLevel5-BeginLevel
ELSE BeginLevel-ExitLevel5
END AS [5_SURPLUS],
CASE
WHEN tblJobEntries.Stance = 1
THEN ExitLevel8-BeginLevel
ELSE BeginLevel-ExitLevel8
END AS [8_SURPLUS],
CASE
WHEN tblJobEntries.Stance = 1
THEN ExitLevel20-BeginLevel
ELSE BeginLevel-ExitLevel20
END AS [20_SURPLUS]
FROM dbo.tblJobEntries)
INSERT INTO @MyOutputParameter ([MyPercentage])
SELECT
COUNT(a.Quirks) * 1.0 /COUNT(b.Quirks)
FROM Quirks_CTE b
LEFT OUTER JOIN Quirks_CTE a
ON b.AnimalDateTime = a.AnimalDateTime
AND exists(select 1 from Surplus_CTE c
where a.AnimalDateTime = c.JobEntryDateTime
AND ([5_SURPLUS] > 0 OR [8_SURPLUS] > 0
OR [20_SURPLUS] > 0)
AND a.Quirks <= @MyInputParameter)
RETURN
END
WITH Quirks_CTE (AnimalDateTime, Quirks)
AS
(SELECT
AnimalDateTime,
(COALESCE (Lion, 0) + COALESCE (Zebra, 0)
+ COALESCE (Antelope, 0) + COALESCE (Giraffe, 0))
FROM dbo.tblAnimals),
Surplus_CTE
AS
(SELECT
JobEntryDateTime,
CASE
WHEN tblJobEntries.Stance = 1
THEN ExitLevel5-BeginLevel
ELSE BeginLevel-ExitLevel5
END AS [5_SURPLUS],
CASE
WHEN tblJobEntries.Stance = 1
THEN ExitLevel8-BeginLevel
ELSE BeginLevel-ExitLevel8
END AS [8_SURPLUS],
CASE
WHEN tblJobEntries.Stance = 1
THEN ExitLevel20-BeginLevel
ELSE BeginLevel-ExitLevel20
END AS [20_SURPLUS],
CASE
WHEN tblJobEntries.Stance = 1
THEN ExitLevelStone-BeginLevel
ELSE BeginLevel-ExitLevelStone
END AS [StoneSurplus]
FROM dbo.tblJobEntries),
AnimalSurplus AS
(
SELECT
Q.AnimalDateTime,
Q.Quirks,
Surplus = CASE WHEN [5_SURPLUS] > 0 OR [8_SURPLUS] > 0 OR [20_SURPLUS] > 0 OR [StoneSurplus] > 0 THEN 1 END
FROM
Quirks_CTE AS Q
LEFT JOIN Surplus_CTE AS S ON Q.AnimalDateTime = S.JobEntryDateTime
)
-- SELECT * FROM AnimalSurplus
SELECT
COUNT(a.Quirks) * 1.0 /COUNT(b.Quirks)
FROM AnimalSurplus b
LEFT OUTER JOIN AnimalSurplus a
ON b.AnimalDateTime = a.AnimalDateTime AND a.Surplus = 1
WHERE b.Quirks <= @MyInputParameter