2016-11-15 2 views
0

Я хочу получить некоторые цифры, и их сумма должна быть больше нуля между следующими временными шкалами: Day-7> 0 и Day-14> 0 и Day-21> 0. Я пытаюсь выяснить, есть ли способ объединить три оператора sql в один звонок более эффективно?Эффективные SQL-комбинирующие повторяющиеся запросы в одном

SELECT DISTINCT NUMBER FROM (
    SELECT NUMBER,SUM(DATA) DATA 
    FROM TABLEA 
    WHERE 
     DATEID >= TO_NUMBER(TO_CHAR(SYSDATE-7,'YYYYMMDD')) 
    GROUP BY VF_NUMBER 
    HAVING SUM(DATA) > 0 

AND 

SELECT NUMBER,SUM(DATA) DATA 
FROM TABLEA 
WHERE 
    DATEID >= TO_NUMBER(TO_CHAR(SYSDATE-14,'YYYYMMDD')) 
GROUP BY VF_NUMBER 
HAVING SUM(DATA) > 0 

AND 

SELECT NUMBER,SUM(DATA) DATA 
FROM TABLEA 
WHERE 
    DATEID >= TO_NUMBER(TO_CHAR(SYSDATE-21,'YYYYMMDD')) 
GROUP BY VF_NUMBER 
HAVING SUM(DATA) > 0 

) 
+0

Что проблема с использованием UNION ALL и соединение запросов в одном одном – XING

ответ

1

фактически> 7,> 14,> 21 => 7 не так ли?

должно работать:

Я редактировал ответ как на комментарий OP в

SELECT VF_NUMBER 
FROM 
(SELECT VF_NUMBER, 
     SUM(CASE WHEN DATEID >= TO_NUMBER(TO_CHAR(SYSDATE-7,'YYYYMMDD')) THEN DATA ELSE 0 END) GREATER_7, 
     SUM(CASE WHEN DATEID >= TO_NUMBER(TO_CHAR(SYSDATE-14,'YYYYMMDD')) THEN DATA ELSE 0 END) GREATER_14, 
     SUM(CASE WHEN DATEID >= TO_NUMBER(TO_CHAR(SYSDATE-21,'YYYYMMDD')) THEN DATA ELSE 0 END) GREATER_21, 
    NUMBER,SUM(DATA) DATA 
FROM TABLEA 
WHERE DATEID >= TO_NUMBER(TO_CHAR(SYSDATE-7,'YYYYMMDD')) 
GROUP BY VF_NUMBER) 
WHERE GREATER_7>0 
AND GREATER_14>0 
AND GREATER_21>0 
+0

идеале да, но может существовать сценарий, что никакие данные не были записаны в одном из последних недель, например, в этом случае> 7 будет иметь значения, но от 14 до 21 может не иметь активности, записанной в столбце данных, поэтому эти числа должны быть исключены. :/ –

+0

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

+0

Спасибо @Bhavesh Ghodasara! –

0
  • SYSDATE-21 охватывает все другие периоды.
  • Я предполагаю, что NUMBER следует заменить на VF_NUMBER.

SELECT VF_NUMBER 
FROM TABLEA 
WHERE 
    DATEID >= TO_NUMBER(TO_CHAR(SYSDATE-21,'YYYYMMDD')) 
GROUP BY VF_NUMBER 
HAVING SUM(DATA) > 0 
Смежные вопросы