Teradata:错误3504,并在Select中生成列子集

时间:2020-09-29 22:54:32

标签: sql select case teradata error-code

您好,我正在尝试解决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行,从而使任何可以解释的人都感激不尽...

1 个答案:

答案 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
;
相关问题