2011-02-18 47 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年以來狀態變化的人,你只需交換日期比較器<。

這有幫助嗎?