2015-04-12 1 views
1

Вот мой запрос ... Я пытаюсь найти все BLNUMBERS, у которых есть более одного контейнера, где все состояния контейнера = ''. Почему это не сработает? В настоящее время я получаю BLNUMBERS, где все состояния контейнеров = '', а также некоторые, где статус <> ''. EDIT: Как я могу найти BLNUMBERS где некоторых контейнеров статус = „“ и некоторые из контейнера»статус <>„“Подсчитайте 'HAVING', где все записи имеют столбец = ''

SELECT 
    DISTINCT 
    BLNUMBER 
    #,CONTAINERNUMBER 
    ,COUNT(CONTAINERNUMBER) AS COUNT 
FROM 
    SHIPMENTS 
WHERE 
     BLNUMBER <> '' 
     AND CDATE > NOW() - INTERVAL 1 MONTH 
     AND CDATE < NOW() - INTERVAL 7 DAY 
     AND CONTAINERNUMBER <> '' 
     AND CONTAINERNUMBER NOT LIKE '.AIR%' 
     AND CONTAINERNUMBER NOT LIKE 'AIR%' 
     AND CARRIER_ID <>8 
     AND STATUS = '' 
    GROUP BY 
     BLNUMBER 
    HAVING 
     COUNT > 1 
+0

«BLNUMBER» должен быть уникальным? если да, то почему вы делаете «SELECT DISTINCT»? Если нет, то просто наличие 'BLNUMBER' делает * not * гарантирует уникальную запись. – chiliNUT

+0

Это не должно быть уникальным. В этой таблице может быть несколько «контейнеров» на «число». Уникальность - это идентификатор. (Я не проектировал эту таблицу) – user3242558

+0

понял, поэтому, если вы только выбираете 'BLNUMBER' и' count' в вышеуказанном запросе, откуда вы знаете, есть ли у вас плохой статус, так как просто 'BLNUMBER' недостаточно для идентификации уникальной записи? – chiliNUT

ответ

1

Так что, если я понимаю правильно, вы хотите, чтобы выбрать все BLNUMBERS, для которого каждый CONTAINER из что BLNUMBER имеет пробел STATUS, что означает, что вы хотите исключить BLNUMBERS, которые имеют не менее 1 CONTAINER с не пустым STATUS?

Так, чтобы сделать это, я бы подсчитать общее число CONTAINER с за BLNUMBER, а затем подсчитать общее число CONTAINER с с пустой STATUS на BLNUMBER, а затем возвращают только BLNUMBERS, которые имеют количество общего CONTAINER s, равное количеству пробелов CONTAINER s.

Так

SELECT 
    totalBlanks.BLNUMBER, 
    totalBlanks.`count` 
FROM 
    (SELECT 
    BLNUMBER, 
    COUNT(*) `count` 
    FROM 
    SHIPMENTS 
    GROUP BY BLNUMBER) totals 
    LEFT JOIN 
    (SELECT 
     BLNUMBER, 
     COUNT(*) `count` 
    FROM 
     SHIPMENTS 
    WHERE `STATUS` = '' 
    GROUP BY BLNUMBER) totalBlanks 
    ON totals.BLNUMBER = totalBlanks.BLNUMBER 
WHERE totals.`count` = totalBlanks.`count` 
+0

Интересно. Я изучаю это. Но это показывает мне каждый BLnumber, даже если у него только одна запись в таблице, с одним контейнером. Мне нужны BLnumbers, которые имеют более одного номера контейнера. – user3242558

+0

Хорошо, я просто добавил «с count> 1» после второй «GROUP BY». Перейдя к результатам прямо сейчас. – user3242558

+0

Это похоже на работу! Спасибо, сэр! Я поработаю над определением того, где некоторый статус = '' и некоторый статус <> '' (за BLNumber), и пусть кто-нибудь знает, что происходит. – user3242558

1

Следующий запрос получает все BLNUMBER S, которые имеют какой-либо контейнер без каких-либо статусов:

SELECT DISTINCT BLNUMBER 
FROM SHIPMENTS 
WHERE BLNUMBER <> '' AND 
     CDATE > NOW() - INTERVAL 1 MONTH AND 
     CDATE < NOW() - INTERVAL 7 DAY AND 
     CONTAINERNUMBER <> '' AND 
     CONTAINERNUMBER NOT LIKE '.AIR%' AND 
     CONTAINERNUMBER NOT LIKE 'AIR%' AND 
     CARRIER_ID <> 8 
GROUP BY BLNUMBER, CONTAINERNUMBER 
HAVING MAX(STATUS) > ''; 

Чтобы получить те, которые имеют несколько контейнеров требуется дополнительный уровень подзапроса:

SELECT BLNUMBER 
FROM (SELECT BLNUMBER, CONTAINERNUMBER 
     FROM SHIPMENTS 
     WHERE BLNUMBER <> '' AND 
      CDATE > NOW() - INTERVAL 1 MONTH AND 
      CDATE < NOW() - INTERVAL 7 DAY AND 
      CONTAINERNUMBER <> '' AND 
      CONTAINERNUMBER NOT LIKE '.AIR%' AND 
      CONTAINERNUMBER NOT LIKE 'AIR%' AND 
      CARRIER_ID <> 8 
     GROUP BY BLNUMBER, CONTAINERNUMBER 
     HAVING MAX(STATUS) > '' 
    ) b 
GROUP BY BLNUMBER 
HAVING COUNT(*) >= 2; 
+0

Да, это дает BL, которому присвоено несколько контейнеров, но кажущееся все со статусом. Сейчас я работаю над BL, у которых есть несколько контейнеров, где некоторые контейнеры имеют какой-либо статус, а некоторые контейнеры не имеют (по умолчанию = '' для статуса в этой таблице). Я пытаюсь изменить исходный запрос, который вы отправили, чтобы выполнить это требование. Я собираюсь опубликовать то, что я придумал. – user3242558

+0

@ user3242558. , , Если у вас есть другой вопрос, вы должны опубликовать его как отдельный вопрос, а не в комментарии или путем изменения вопроса таким образом, чтобы ответы недействительны. –