您好,我正在尝试解决Teradata sql问题,我需要排除2005年8月的所有saledate,并为不少于20个销售日的任何商店计算每个商店/月/年组合的每日收入。 / p>
我的想法是在子查询中生成saledate列的子集并使用它。这是我的代码。
SELECT Sub.store, Sub.Year_, Sub.Month_, Sub.TotalSaleDate, Sub.Daily_rev, sub.Total_rev
FROM (SELECT (CASE WHEN (NOT (EXTRACT(MONTH from saledate)=8
AND EXTRACT(YEAR from saledate)=2005)) THEN saledate END) AS
NewSaleDate, COUNT(NewSaleDate) AS TotalSaleDate,
SUM(amt) AS Total_rev,
Total_rev/TotalSaleDate AS Daily_rev,
EXTRACT(MONTH from NewSaleDate) AS Month_,
EXTRACT(YEAR from NewSaleDate) AS Year_, store
FROM trnsact
WHERE stype = 'P' AND saledate = NewSaleDate
GROUP BY store, Year_, Month_, NewSaleDate) AS Sub
WHERE Sub.TotalSaleDate >= 20
ORDER BY sub.TotalSaledate ASC;
这是我的输出 My result
这是工作的人的代码
SELECT
sub.store, sub.year_num, sub.month_num, sub.num_dates, sub.daily_revenue
FROM (
SELECT
store,
EXTRACT (month FROM saledate) AS month_num,
EXTRACT (year FROM saledate) AS year_num,
COUNT (DISTINCT saledate) AS num_dates,
SUM(amt) AS total_revenue,
total_revenue/num_dates AS daily_revenue,
(CASE
WHEN (year_num=2005 AND month_num=8) THEN 'cannot' ELSE 'can'
END) As can_use_anot
FROM trnsact
WHERE stype='p' AND can_use_anot='can'
GROUP BY store, month_num, year_num
) AS sub
HAVING sub.num_dates >=20
GROUP BY sub.store, sub.year_num, sub.month_num, sub.num_dates, sub.daily_revenue
ORDER BY sub.num_dates ASC;
他的结果 Correct result
显然,他的每日收入比我的收入高得多。我想知道是否是由于我没有在子查询中计算Distinct saledate。但是,我试图添加使用COUNT(DISTINCT saledate),但我完全没有输出,0行。我了解他的代码是如何工作的,但是我对代码中哪里出了问题感到沮丧。 尤其是为什么向不同的地方添加0行,从而使任何可以解释的人都感激不尽...
答案 0 :(得分:0)
选择#1按日期汇总,而#2按月汇总,只需比较返回的行数即可。
我不明白为什么两个查询都使用这种奇怪的方式来排除2005年8月以来的日期。应该使用简单的WHERE saledate not between date '2005-08-01' and date '2005-08-31'
并且不需要使用派生表:
SELECT
store,
EXTRACT (month FROM saledate) AS month_num,
EXTRACT (year FROM saledate) AS year_num,
COUNT (DISTINCT saledate) AS num_dates,
SUM(amt) AS total_revenue,
total_revenue/num_dates AS daily_revenue
FROM trnsact
WHERE saledate not between date '2005-08-01' and date '2005-08-31'
and stype='p'
GROUP BY store, month_num, year_num
HAVING num_dates >=20
ORDER BY sub.num_dates ASC;
但是,每天/每月可能会有大量的行,因此每天进行汇总可能会更有效,避免所有行都使用EXTRACT和COUNT(DISTINCT):
SELECT -- now aggregate by month
store,
EXTRACT (month FROM saledate) AS month_num,
EXTRACT (year FROM saledate) AS year_num,
COUNT (*) AS num_dates, -- no need for DISTINCT anymore
SUM(daily_amt) AS total_revenue,
total_revenue/num_dates AS daily_revenue
FROM
( -- daily sales first
SELECT
store,
saledate,
SUM(amt) AS daily_amt
FROM trnsact
WHERE saledate not between date '2005-08-01' and date '2005-08-31'
and stype='p'
GROUP BY store, saledate
) as dt
GROUP BY store, year_num, month_num
;