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