SQL Group оракула по подзапросу - PullRequest
0 голосов
/ 14 ноября 2018

Я получаю один и тот же номер электронной торговли для каждой даты.Я пытаюсь получить значение электронной коммерции в зависимости от даты, которая отличается для каждой даты, поскольку общее число составляет всего 105 за весь октябрь, а не 391958. Любая идея, как сгруппировать по выводу подзапроса?Спасибо!

SELECT   to_char(wcs1.start_tms,'DD/MM/YYYY') as dates,
(
    SELECT count(*) 
    FROM   ft_t_wcs1 wcs1,ft_t_stup stup 
    WHERE  stup.modl_id='ECOMMERC'
    AND    stup.CROSS_REF_ID=wcs1.acct_id
    AND    stup.end_tms IS NULL
) AS     ecommerce
FROM     ft_t_wcs1 wcs1, ft_t_stup stup
WHERE    wcs1.scenario='CREATE' 
AND      wcs1.acct_id IS NOT NULL 
AND      wcs1.start_tms BETWEEN add_months(TRUNC(SYSDATE,'mm'),-1) AND LAST_DAY(add_months(TRUNC(SYSDATE,'mm'),-1))
GROUP BY to_char(wcs1.start_tms,'DD/MM/YYYY')
ORDER BY to_char(wcs1.start_tms,'DD/MM/YYYY');

ВЫХОД enter image description here

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Трудно предложить ответ, не понимая ваших отношений с таблицей, но я могу сказать, что ваша проблема в том, что нет никакой связи между вашим подзапросом и вашим основным запросом. Ваш подзапрос просто возвращает счетчик, где modl_id='ECOMMERC', так что это значение всегда будет одинаковым - в вашем случае 105. Вам необходимо добавить критерии JOIN в подзапрос, который связывает уникальное значение с вашим основным запросом. Вы также захотите присвоить псевдонимам таблицы имена по-разному, чтобы обеспечить правильное соединение.

0 голосов
/ 14 ноября 2018

Вы делаете ненужные объединения, когда вы просто хотите коррелированный подзапрос:

SELECT to_char(wcs1.start_tms,'DD/MM/YYYY') as dates,
       (SELECT count(*) 
        FROM ft_t_stup stup 
        WHERE stup.modl_id=  'ECOMMERC' AND
              stup.CROSS_REF_ID = wcs1.acct_id
              stup.end_tms IS NULL
       ) AS ecommerce
FROM ft_t_wcs1 wcs1
WHERE wcs1.scenario = 'CREATE' AND
      wcs1.acct_id IS NOT NULL AND
      wcs1.start_tms BETWEEN add_months(TRUNC(SYSDATE,'mm'),-1) AND LAST_DAY(add_months(TRUNC(SYSDATE,'mm'),-1))
GROUP BY to_char(wcs1.start_tms, 'DD/MM/YYYY')
ORDER BY to_char(wcs1.start_tms, 'DD/MM/YYYY');
0 голосов
/ 14 ноября 2018

Попробуйте ниже модифицированные запросы

select to_char(wcs1.start_tms,'DD/MM/YYYY') as dates,count(*) AS 
ecommerce
from ft_t_wcs1 wcs1, ft_t_stup stup
where stup.modl_id='ECOMMERC' and stup.CROSS_REF_ID=wcs1.acct_id and stup.end_tms is null wcs1.scenario='CREATE' and wcs1.acct_id is not null and 
wcs1.start_tms between add_months(TRUNC(SYSDATE,'mm'),-1) and 
LAST_DAY(add_months(TRUNC(SYSDATE,'mm'),-1))
group by to_char(wcs1.start_tms,'DD/MM/YYYY')
order by to_char(wcs1.start_tms,'DD/MM/YYYY');

- Другой способ использования предложения JOIN

select to_char(wcs1.start_tms,'DD/MM/YYYY') as dates,count(*) AS 
ecommerce
from ft_t_wcs1 wcs1 
join ft_t_stup stup
ON stup.CROSS_REF_ID=wcs1.acct_id
where stup.modl_id='ECOMMERC' and stup.end_tms is null wcs1.scenario='CREATE' and wcs1.acct_id is not null and 
wcs1.start_tms between add_months(TRUNC(SYSDATE,'mm'),-1) and 
LAST_DAY(add_months(TRUNC(SYSDATE,'mm'),-1))
group by to_char(wcs1.start_tms,'DD/MM/YYYY')
order by to_char(wcs1.start_tms,'DD/MM/YYYY');
...