sql oracle 按子查询分组

sql oracle group by subquery

每个日期我都得到相同的电子商务编号。我正在尝试根据日期获取电子商务价值计数,每个日期都不同,因为整个 10 月的总数仅为 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');

输出

尝试以下修改后的查询

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');

如果不了解您的 table 关系,很难提出答案,但我可以看出您的问题是子查询与主查询之间没有关系。您的子查询只是 returns 计数 modl_id='ECOMMERC',因此该值将始终相同 - 在您的情况下为 105。您需要向子查询添加 JOIN 条件,将唯一值与主查询联系起来询问。您还需要为 table 名称设置不同的别名,以确保您正确加入。

当您只需要一个相关的子查询时,您正在做不必要的连接:

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');