2011-02-18 48 views
1

编辑SQL输出问题

我遇到了一个错误,我知道发生了什么,但我看不出是什么原因造成的。下面是我使用的SQL代码。基本上,我得到了我想要的一般结果,但是我没有准确地给出查询正确的'where'子句。

如果这有任何帮助。计数如下:

Total  Tier 
1   High 
2   Low 

注册表中有4条记录。 3是有效的,1不是。应只显示2条记录。 1代表高,1代表低。总数第二低的记录在2010年12月30日被标记为“不活跃”,并在2011年12月1日再次重新标记,因此它不应该在结果中。我将最初的'< ='更改为'=',结果保持不变。

我需要排除Enrollments_Status_Change中的任何记录,其中“active_status”在日期之前已更改为0。

SELECT COUNT(dbo.Enrollments.Customer_ID) AS Total, 
     dbo.Phone_Tier.Tier 
    FROM dbo.Phone_Tier as p 
    JOIN dbo.Enrollments as eON p.Phone_Model = e.Phone_Model 
     WHERE (e.Customer_ID NOT IN 
       (Select Customer_ID 
       From dbo.Enrollment_Status_Change as Status 
       Where (Change_Date >'12/31/2010'))) 
GROUP BY dbo.Phone_Tier.Tier 

感谢您的任何帮助,我对任何困惑道歉。这是我第一次来这里,我正试图纠正我的礼节。

+0

将来,请格式化您的代码以方便其他人阅读。在这种情况下,我为你做了这个。 – 2011-02-18 21:50:44

+0

我为格式化表示抱歉。 – Randal 2011-02-18 21:52:14

+0

也对双重职位感到抱歉。我需要表格,因为它是基于时间的。 – Randal 2011-02-18 21:52:39

回答

2

如果你不想从表dbo.Enrollment_Status_Change的任何字段,并且你似乎没有以任何方式使用它 - 为什么甚至将它包括在JOIN中?只是把它留下。

加:开始使用表别名。如果您在每个JOIN条件和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 

另外:最有可能的,你的检查存在是错误的 - 因为你没有发表您的表结构,我只能猜测 - 但我的猜测是:

AND EXISTS (SELECT * FROM dbo.Enrollment_Status_Change 
       WHERE Change_Date <= '12/31/2010' AND CustomerID = e.CustomerID) 

检查由e.CustomerID定义的客户在dbo.Enrollment_Status_Change任何条目的存在,与截止日期前Change_Date。对?

0

假设你想:

  • 排除所有客户,其最新enrollment_status_change纪录是自2011年 开始

  • 包括所有客户,其最新enrollment_status_change纪录是早于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 

基本上,你的代码的问题是,加入一个一对多表将随时增加行数。如果你想排除全部在另一个表中有一个匹配行的记录,这将是很好 - 你可以使用一个LEFT JOIN,然后设置一个WHERE子句,如Customer_ID IS NULL。

但是因为您想排除enrollment_status_change表的子集,所以您必须使用子查询。

从给出的例子中我不清楚你的意图,但是如果你想排除像2011年之前的任何enrollment_status_change任何人,但包括那些自2011年以来状态变化的人,你只需交换日期比较器<。

这有帮助吗?