SQL输出问题
编辑 我遇到了一个错误,我知道发生了什么,但我看不出是什么导致了它。下面是我正在使用的sql代码。基本上,我得到了我想要的一般结果,但是我没有准确地为查询提供正确的where子句 如果这有什么帮助的话。计数结果如下:SQL输出问题,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,编辑 我遇到了一个错误,我知道发生了什么,但我看不出是什么导致了它。下面是我正在使用的sql代码。基本上,我得到了我想要的一般结果,但是我没有准确地为查询提供正确的where子句 如果这有什么帮助的话。计数结果如下: Total Tier 1 High 2 Low 登记表中有4条记录。3个激活,1个未激活。只应显示其中两条记录。1表示高,1表示低。总数中的第二个低记录在2010年12月30日被标记为“非活动”,并在2011年1月12日再次重新
Total Tier
1 High
2 Low
登记表中有4条记录。3个激活,1个未激活。只应显示其中两条记录。1表示高,1表示低。总数中的第二个低记录在2010年12月30日被标记为“非活动”,并在2011年1月12日再次重新标记,因此不应出现在结果中。如果您不想更改表dbo.Enrollment\u Status\u中的任何字段,并且您似乎没有以任何方式使用它,那么我更改了初始“”,为什么还要将其包含在联接中?别提了 另外:开始使用表别名。如果在每个连接条件和WHERE子句中使用完整的表名,则很难理解这一点 您的代码应该是:
SELECT
COUNT(e.Customer_ID) AS Total, p.Tier
FROM
dbo.Phone_Tier p
INNER JOIN
dbo.Enrollments e ON p.Phone_Model = e.Phone_Model
WHERE
e.Active_Status = 1
AND EXISTS (SELECT DISTINCT Customer_ID
FROM dbo.Enrollment_Status_Change AS Status
WHERE (Change_Date <= '12/31/2010'))
GROUP BY
p.Tier
另外:最有可能的是,您的EXISTS检查是错误的-因为您没有发布表结构,我只能猜测-但我的猜测是:
AND EXISTS (SELECT * FROM dbo.Enrollment_Status_Change
WHERE Change_Date <= '12/31/2010' AND CustomerID = e.CustomerID)
检查e.CustomerID定义的客户的dbo.Enrollment\u Status\u Change中是否存在任何条目,更改日期在截止日期之前。对吗?假设您想:
排除自2011年初以来其最新注册状态更改记录为的所有客户
但是
包括最近一次注册状态变更记录早于2010年底的所有客户,否则您为什么要加入EXISTS条款
那么这应该可以做到:
SELECT COUNT(e.Customer_ID) AS Total,
p.Tier
FROM dbo.Phone_Tier p
JOIN dbo.Enrollments e ON p.Phone_Model = e.Phone_Model
WHERE dbo.Enrollments.Active_Status = 1
AND e.Customer_ID NOT IN (
SELECT Customer_ID
FROM dbo.Enrollment_Status_Change status
WHERE (Change_Date >= '2011-01-01')
)
GROUP BY p.Tier
基本上,代码的问题在于加入一对多表总是会增加行数。如果要排除另一个表中具有匹配行的所有记录,则可以使用左连接,然后设置一个WHERE子句,如Customer_ID为NULL
但是,由于要排除“注册\状态\更改”表的子集,因此必须使用子查询
从给出的示例中,您的意图并不明确,但如果您想排除2011年之前注册状态发生变化的人,但包括自2011年以来状态发生变化的人,您只需在将来交换日期比较符,请格式化您的代码以便于其他人阅读。在这个例子中,我已经为您完成了此操作。您不能从您的加入中删除“注册\u状态\u更改”表并获得所需的结果吗?在您的查询中,我看不到有任何地方使用了来自此表的主查询中的信息……仅在EXISTS子句中,在EXISTS子查询中选择特定列是没有意义的。此外,该子查询没有以任何方式连接到外部查询,因此无论外部查询行的内容如何,EXISTS要么始终为true,要么始终为false。我怀疑这不是你想要的。我同意其他评论者的观点,他们说省略注册\u状态\u更改左加入。在查询中不使用它。说你需要它是因为它是基于时间的是没有意义的。要么在特定查询中需要它,要么不需要。您可能在其他查询中需要它,但在这个查询中不需要。@Randal:如果您在编写注释时意外地按了Enter键,您最多可以编辑注释五分钟。是的,这是正确的。在enroll_status(注册_状态)表中,每次活动_状态更改时都会显示多条记录。是的,这很有意义,这正是我正在尝试做的。很抱歉,我不能早些准确地说明这一点。但是,当我尝试上面的代码时,它仍然给我提供了2010年12月30日更改的附加记录,这可能会有所帮助。基本上,在该日期之前或之后发生的任何变化都不应包含在结果中。结果基于特定日期登记表中的实际内容。因此,如果某物在该日期之前或之后更改为非活动状态,则只有在2010年12月31日处于活动状态时,才会将其包含在Resultl中。这有帮助吗?然后将更改日期>='2011-01-01'更改为更改日期='2010-12-30'?
SELECT COUNT(e.Customer_ID) AS Total,
p.Tier
FROM dbo.Phone_Tier p
JOIN dbo.Enrollments e ON p.Phone_Model = e.Phone_Model
WHERE dbo.Enrollments.Active_Status = 1
AND e.Customer_ID NOT IN (
SELECT Customer_ID
FROM dbo.Enrollment_Status_Change status
WHERE (Change_Date >= '2011-01-01')
)
GROUP BY p.Tier