Вопрос вывода SQL - PullRequest
       2

Вопрос вывода SQL

1 голос
/ 19 февраля 2011

Отредактированный

Я сталкиваюсь с ошибкой, и я знаю, что происходит, но я не вижу, что это вызывает. Ниже приведен SQL-код, который я использую. По сути, я получаю общие результаты, которые мне нужны, однако я не точно задаю в запросе правильное предложение «где».

Если это поможет. Счет выходит как это:

Total       Tier
1           High
2           Low

В таблице регистрации есть 4 записи. 3 активны, а 1 нет. Только 2 из записей должны отображаться. 1 для высокого и 1 для низкого. Вторая запись Low, которая находится в общем количестве, была помечена как «неактивная» 30/30/2010 и снова помечена 12 января 2011 года, поэтому ее не должно быть в результатах. Я изменил начальный '<=' на '=', и результаты остались прежними. </p>

Мне нужно исключить любую запись из 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

Спасибо за любую помощь, и я прошу прощения за любую путаницу. Я впервые здесь, и я пытаюсь исправить свой этикет на лету.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2011

Если вам не нужны какие-либо поля из этой таблицы dbo.Enrollment_Status_Change, и вы, похоже, не используете их каким-либо образом - зачем вообще включать их в СОЕДИНЕНИЯ?Просто оставьте это.

Plus: начните использовать псевдонимы таблиц .Это очень трудно прочитать, если вы используете полное имя таблицы в каждом условии 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

Также: скорее всего, ваша проверка EXISTSнеправильно - поскольку вы не публиковали свои структуры таблиц, я могу только догадываться - но мое предположение будет следующим:

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

Проверьте наличие любых записей в dbo.Enrollment_Status_Change для клиента, определенного e.CustomerIDс Change_Date до этой даты отсечения.Верно?

0 голосов
/ 19 февраля 2011

Предположим, что вы хотите:

  • исключить всех клиентов, чья последняя запись 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, вы должны использовать подзапрос.

Ваше намерение неясно из приведенного примера, но если вы хотите исключитьЕсли вы используете enrollment_status_change до 2011 года, но включаете тех, кто изменил статус с 2011 года, вы просто поменяете компаратор даты на <. </p>

Это поможет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...