2013-08-05 4 views
1
Select convert(varchar(8), max(checkdate),1) lastcheckdate 
from table 
where status = 'processed' 
and not status in ('delivered', 'scheduled') 

Select convert(varchar(8), max(checkdate),1) as nextcheckdate 
from table 
where status = 'scheduled' 
and not status in ('delivered', 'processed') 

То, что я ищу, это 1 единственный ряд, который имеет nextcheckdate и lastcheckdate. Любая помощь будет большой.Возможно ли иметь эти 2 запроса в одном?

+0

Можете ли вы сказать нам, что первичный ключ для таблицы пожалуйста ? –

+0

Первичным ключом будет код компании. 4-значный код, присвоенный каждой компании в db. – BSanders

+0

Не будет ли 'nextcheckdate'' MIN 'проверок с« запланированным »статусом? просто пытаясь понять контекст здесь ... – Beno

ответ

3

Формально, я думаю, что следующее возвращает два значения.

select convert(varchar(8), max(case when status = 'processed' then checkdate end), 1 
      ) as lastcheckdate, 
     convert(varchar(8), max(case when status = 'scheduled' then checkdate end), 1 
      ) as nextcheckdate 
from table; 

Тем не менее, ваши запросы являются нечувствительными. Предложение where в каждом случае проверяет, имеет ли статус значение (скажем 'processed'). Когда это верно, часть not всегда верна.

Это заставляет меня подозревать, что есть некоторая агрегация участвует, где вы ищете processed на строки с некоторым идентификатором, которые не обладают delivered или scheduled значения. Это предположение, потому что в вопросе недостаточно информации, чтобы знать, что вы действительно ищете.

+0

Ну, мой стол действительно огромная таблица календаря. Он состоит из компании, проверки и статуса. Состояние обрабатывается, что означает, что зарплата запустилась, запланированное значение означает, что оно будет запущено или поставлено, что означает его обработку, и было отмечено как поставленное. Я пытаюсь создать последнюю дату проверки компаний и следующую проверку в запросе, чтобы лучше помочь моим клиентам csr отслеживать их клиентов. Надеюсь, это даст вам лучшую идею. – BSanders

+2

@ пользователь1919939. , , Ваша проблема кажется настолько удаленной от этого вопроса, что я предлагаю удалить этот вопрос и задать другой вопрос. Предоставьте примерные данные и ожидаемые результаты вместе с ним. –

1

Ваши предложения WHERE являются излишними.

Select convert(varchar(8), max(checkdate),1) lastcheckdate 
from table 
where status = 'processed' 
and not status in ('delivered', 'scheduled') 

Для любой строки искали, если статус = «обработано», то статус не является ни «доставлено», ни «запланировано». Они эксклюзивные.

Поэтому приступите к решению проблемы путем сокращения кода.

Select convert(varchar(8), max(checkdate),1) lastcheckdate 
from table 
where status = 'processed' 

Select convert(varchar(8), max(checkdate),1) as nextcheckdate 
from table 
where status = 'scheduled' 

Теперь посмотрите на столбцы выбора. Обратите внимание, что логика функции идентична, за исключением того, что вы накладываете друг на друга столбцы по-разному.

Давайте сделаем их согласованными.

Select convert(varchar(8), max(checkdate),1) as next_or_last_check_date 
from table 
where status = 'processed' 

Select convert(varchar(8), max(checkdate),1) as next_or_last_check_date 
from table 
where status = 'scheduled' 

Теперь единственная разница в двух проверках состояния. Мы можем ИЛИ их вместе, чтобы сделать один запрос или использовать IN (то же самое).

Select convert(varchar(8), max(checkdate),1) as next_or_last_check_date 
from table 
where status = 'processed' 
    or status = 'scheduled' 

то же самое, используя в:

Select convert(varchar(8), max(checkdate),1) as next_or_last_check_date 
from table 
where status IN ('processed', 'scheduled') 
+0

Я думаю, что OP ищет строку с двумя столбцами - 'nextcheckdate' и' lastcheckdate' - не максимальный из обоих. – Beno

1

попробовать это.

SELECT 
    CASE WHEN status = 'processed' 
      THEN convert(varchar(8), max(checkdate),1) 
    END as lastcheckdate, 

    CASE WHEN status = 'scheduled' 
      THEN convert(varchar(8), max(checkdate),1) 
    END as nextcheckdate 

    FROM table 
    WHERE status in ('processed', 'scheduled') GROUP BY status 

Это вернет два ряда.

Недовольны 2-мя рядами? Тогда сделайте это.

DECLARE @table1 TABLE (lastcheckdate int,nextcheckdate int) 
    DECLARE @table2 TABLE (lastcheckdate int,nextcheckdate int) 

    DECLARE @lastcheckdate int 
    DECLARE @nextcheckdate Int 

    INSERT INTO @table1(lastcheckdate ,nextcheckdate) 
      SELECT 
      CASE WHEN status = 'processed' 
        THEN convert(varchar(8), max(checkdate),1) 
      END as lastcheckdate, 
      CASE WHEN status = 'scheduled' 
        THEN convert(varchar(8), max(checkdate),1) 
      END as nextcheckdate 
      FROM table 
      WHERE status in ('processed', 'processed') GROUP BY status 

    DECLARE test_cur CURSOR 
     FOR SELECT lastcheckdate,nextcheckdate FROM @table1 

    OPEN test_cur 
    FETCH NEXT FROM test_cur INTO @lastcheckdate,@nextcheckdate 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     IF @lastcheckdate IS NOT NULL 
     BEGIN 
      INSERT INTO @Table2 (lastcheckdate) VALUES(@lastcheckdate) 
     END 
     ELSE 
     BEGIN 
      UPDATE @Table2 SET nextcheckdate = @nextcheckdate 
     END 

     FETCH NEXT FROM test_cur INTO @lastcheckdate,@nextcheckdate 
    END 
    SELECT * FROM @Table2 
1

Вы дали нам слишком мало информации, чтобы работать на, но при условии, что оба ваши запросы функциональны и каждый возвращается только одна строка и цель состоит в том, как вы выразились ... 1 однорядные, который имеет nextcheckdate и lastcheckdate. .. вы можете использовать CROSS JOIN для получения этой строки

SELECT a.lastcheckdate, b.nextcheckdate 
    FROM 
( 
    SELECT CONVERT(VARCHAR(8), MAX(checkdate), 1) lastcheckdate 
    FROM table 
    WHERE status = 'processed' 
    AND NOT STATUS IN ('delivered', 'scheduled') 
) a CROSS JOIN 
(
    SELECT CONVERT(VARCHAR(8), MAX(checkdate), 1) nextcheckdate 
    FROM table 
    WHERE status = 'scheduled' 
    AND NOT STATUS IN ('delivered', 'processed') 
) b 

Здесь SQLFiddle демо

1

попробовать этот

select x.customer_id,x.customer_name, 
(Select max(checkdate) 
from table 
where status = 'processed' and customer_id = x.customer_id) Lastcheckdate, 
(Select max(checkdate) from table 
where status = 'scheduled' and customer_id = x.customer_id) nextcheckdate 
from table x where and not x.status in ('delivered', 'scheduled') 
1
select 
    case when status = 'processed' then convert(varchar(8),checkdate) else null end as lastcheckddate 
,case when status = 'scheduled' then convert(varchar(8),checkdate) else null end as nextcheckddate 
from 
    table 
where (status = 'processed' and status not in ('delivered', 'scheduled')) 
    or (status = 'scheduled' and status not in ('delivered', 'processed')) 
Смежные вопросы