通过在SQL中对txn月份进行分组,对查询进行分组以查找数据

通过在SQL中对txn月份进行分组,对查询进行分组以查找数据,sql,oracle-sqldeveloper,aggregate-functions,Sql,Oracle Sqldeveloper,Aggregate Functions,我有以下两个查询,我正在使用“查找新客户”和“返回客户”。为了找到每个月的新客户和ret客户,我必须通过更改日期来运行以下查询。例如,如果我运行一月、二月和三月的查询,我必须运行它3次。有没有办法只运行一次就可以获得3个月的数据?我尝试将它加入到我们的会计日历表中,并按会计月对其进行分组,但与单独运行时相比,它为每个月提供了不同的数字 这是我正在运行多次的原始查询。 SELECT DECODE(is_new, 1, 'New Customers', 'Returning Customer

我有以下两个查询,我正在使用“查找新客户”和“返回客户”。为了找到每个月的新客户和ret客户,我必须通过更改日期来运行以下查询。例如,如果我运行一月、二月和三月的查询,我必须运行它3次。有没有办法只运行一次就可以获得3个月的数据?我尝试将它加入到我们的会计日历表中,并按会计月对其进行分组,但与单独运行时相比,它为每个月提供了不同的数字

这是我正在运行多次的原始查询。

SELECT
    DECODE(is_new, 1, 'New Customers', 'Returning Customers') type_of_customer,
    COUNT(distinct individual_id) count_of_customers,
    sum(dollar_value_us) dollar_value_us,
    sum(Margin),
    SUM(count_of_transactions) count_of_transactions,
    SUM(sum_of_quantity) sum_of_quantity
    from (
SELECT DISTINCT
             individual_id,
             SUM (dollar_value_us)             dollar_value_us,
             SUM (quantity)                    sum_of_quantity,
             sum(dollar_value_us) - sum(cogs*quantity) as Margin,
             COUNT (DISTINCT transaction_number) count_of_transactions,
             CASE WHEN MIN (TRUNC (txn_date)) = min_txn_date THEN 1 ELSE 0 END
                 is_new
        FROM (SELECT individual_id,
                     dollar_value_us,
                     txn_date,
                     quantity,
                     cogs,
                     transaction_number,
                     MIN (TRUNC (txn_date)) OVER (PARTITION BY individual_id)
                         min_txn_date
               FROM TRANSACTION_table A JOIN sku_table B ON A.SKU = B.ITEM
               WHERE     brand_org_code = 'brand'
                      and "sku" = 'SKU1')
       WHERE TRUNC (txn_date) BETWEEN '01-JAN-20' AND '31-JAN-20'
       and INDIVIDUAL_ID is not null
    GROUP BY individual_id, min_txn_date)
    group by is_new;
SELECT
    DECODE(is_new, 1, 'New Customers', 'Returning Customers') type_of_customer,
    FISCAL_YEAR_MONTH,
    COUNT(distinct individual_id) count_of_customers,
    sum(dollar_value_us) dollar_value_us,
    sum(Margin),
    SUM(count_of_transactions) count_of_transactions,
    SUM(sum_of_quantity) sum_of_quantity
    from (
SELECT DISTINCT
             individual_id,
             FISCAL_YEAR_MONTH,
             SUM (dollar_value_us)             dollar_value_us,
             SUM (quantity)                    sum_of_quantity,
             sum(dollar_value_us) - sum(cogs*quantity) as Margin,
             COUNT (DISTINCT transaction_number) count_of_transactions,
             CASE WHEN MIN (TRUNC (txn_date)) = min_txn_date THEN 1 ELSE 0 END
                 is_new
        FROM (SELECT individual_id,
                     dollar_value_us,
                     txn_date,
                     FISCAL_YEAR_MONTH,
                     quantity,
                     cogs,
                     transaction_number,
                     MIN (TRUNC (txn_date)) OVER (PARTITION BY individual_id)
                         min_txn_date
               FROM TRANSACTION_table A JOIN sku_table B ON A.SKU = B.ITEM
               WHERE brand_org_code = 'brand'
               and "sku" = 'SKU1') A join fiscal_calendar_table c on a.TRUNC(A.TXN_DATE) = C.DATE_ID
       WHERE TRUNC (txn_date) BETWEEN '01-JAN-20' AND '31-JAN-20'
       and INDIVIDUAL_ID is not null
    GROUP BY individual_id, min_txn_date, FISCAL_YEAR_MONTH)
    group by is_new, FISCAL_YEAR_MONTH;
这是一个查询,我将其与会计日历表结合起来,按会计月对其进行分组,这样我就不必为每个月反复运行查询,但返回的数据与我单独运行上述查询时的数据不匹配。

SELECT
    DECODE(is_new, 1, 'New Customers', 'Returning Customers') type_of_customer,
    COUNT(distinct individual_id) count_of_customers,
    sum(dollar_value_us) dollar_value_us,
    sum(Margin),
    SUM(count_of_transactions) count_of_transactions,
    SUM(sum_of_quantity) sum_of_quantity
    from (
SELECT DISTINCT
             individual_id,
             SUM (dollar_value_us)             dollar_value_us,
             SUM (quantity)                    sum_of_quantity,
             sum(dollar_value_us) - sum(cogs*quantity) as Margin,
             COUNT (DISTINCT transaction_number) count_of_transactions,
             CASE WHEN MIN (TRUNC (txn_date)) = min_txn_date THEN 1 ELSE 0 END
                 is_new
        FROM (SELECT individual_id,
                     dollar_value_us,
                     txn_date,
                     quantity,
                     cogs,
                     transaction_number,
                     MIN (TRUNC (txn_date)) OVER (PARTITION BY individual_id)
                         min_txn_date
               FROM TRANSACTION_table A JOIN sku_table B ON A.SKU = B.ITEM
               WHERE     brand_org_code = 'brand'
                      and "sku" = 'SKU1')
       WHERE TRUNC (txn_date) BETWEEN '01-JAN-20' AND '31-JAN-20'
       and INDIVIDUAL_ID is not null
    GROUP BY individual_id, min_txn_date)
    group by is_new;
SELECT
    DECODE(is_new, 1, 'New Customers', 'Returning Customers') type_of_customer,
    FISCAL_YEAR_MONTH,
    COUNT(distinct individual_id) count_of_customers,
    sum(dollar_value_us) dollar_value_us,
    sum(Margin),
    SUM(count_of_transactions) count_of_transactions,
    SUM(sum_of_quantity) sum_of_quantity
    from (
SELECT DISTINCT
             individual_id,
             FISCAL_YEAR_MONTH,
             SUM (dollar_value_us)             dollar_value_us,
             SUM (quantity)                    sum_of_quantity,
             sum(dollar_value_us) - sum(cogs*quantity) as Margin,
             COUNT (DISTINCT transaction_number) count_of_transactions,
             CASE WHEN MIN (TRUNC (txn_date)) = min_txn_date THEN 1 ELSE 0 END
                 is_new
        FROM (SELECT individual_id,
                     dollar_value_us,
                     txn_date,
                     FISCAL_YEAR_MONTH,
                     quantity,
                     cogs,
                     transaction_number,
                     MIN (TRUNC (txn_date)) OVER (PARTITION BY individual_id)
                         min_txn_date
               FROM TRANSACTION_table A JOIN sku_table B ON A.SKU = B.ITEM
               WHERE brand_org_code = 'brand'
               and "sku" = 'SKU1') A join fiscal_calendar_table c on a.TRUNC(A.TXN_DATE) = C.DATE_ID
       WHERE TRUNC (txn_date) BETWEEN '01-JAN-20' AND '31-JAN-20'
       and INDIVIDUAL_ID is not null
    GROUP BY individual_id, min_txn_date, FISCAL_YEAR_MONTH)
    group by is_new, FISCAL_YEAR_MONTH;

任何形式的帮助都将不胜感激。提前谢谢

您的会计月是否与日历月的第一天和最后一天对齐?我建议您阅读以下内容:如果您按照日期范围过滤第二个查询
'01-JAN-20'和'31-JAN-20'
,那么您就不会从额外的连接中获益,按财政分类也没有多大意义month@PaulMaxwell是的,这是一个错误,第二个查询中的日期范围应为'01-JAN-20'和'31-MAR-20'