Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL输出问题_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL输出问题

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日再次重新

编辑

我遇到了一个错误,我知道发生了什么,但我看不出是什么导致了它。下面是我正在使用的sql代码。基本上,我得到了我想要的一般结果,但是我没有准确地为查询提供正确的where子句

如果这有什么帮助的话。计数结果如下:

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