【问题标题】:SQL Sum count of product by Member and product YTD of the product count [closed]SQL Sum count of product by Member and product YTD of the product count [关闭]
【发布时间】:2020-07-11 15:12:18
【问题描述】:
SELECT DISTINCT 
  DMC.MEM_NBR, 
  FIRST_NAME, 
  LAST_NAME, 
  PRODUCT_DESC, 
  DD.YEAR_MONTH AS FILL_DATE, 
  FC.PRODUCT_NBR 
  CASE 
    WHEN CAST ((CURRENT_DATE - DOB.DATE_DATE) / 365.25 as Int) >= 18  Then '18+'
    ELSE 'Less than 18'
  END MEM_AGE
FROM FT_PRODUCT_CLAIM FC
LEFT JOIN DIM_PRODUCT PRODUCT ON FC.PRODUCT_DIM_CK=PRODUCT.PRODUCT_DIM_CK
LEFT JOIN DIM_MEMBER DMC ON DMC.MEMBER_DIM_CK = FC.MEMBER_DIM_CK 
INNER JOIN DIM_DATE DD ON DD.DATE_DIM_CK = FC.PRODUCT_DATE_DIM_CK 
INNER JOIN DIM_DATE DOB ON DOB.DATE_DIM_CK = DMC.BIRTH_DATE_DIM_CK 
WHERE FC.PRODUCT_NBR IN (SELECT * FROM TBL_PRODUCT)
AND FILL_DATE between 202001 and 202002
AND MEM_AGE = '18+'
ORDER BY FIRST_NAME

-- 问题: ---通过产品编号计算有多少产品与会员相关联 ---想总结每个成员的唯一产品NBRS的数量(MBR_NBR) ---然后为每个新的月份(Fill_Date)为会员的每个产品总和添加一个 YTD

【问题讨论】:

  • 我想添加两个新字段,Product_Count,YTD_Product_Count,其中 Product_Count 将是 Product_NBR 总和的不同计数,YTD_Product_Count 将是 YTD 总数
  • 有人对如何有效地做到这一点有任何想法吗?
  • 您想要的两个新字段是:1) 每个成员的唯一产品总数,2) 年初至今每个成员每月的产品数 (FILL_DATE)? YTD 必须是独特产品的数量还是可以是总产品?
  • Ytd 是会员每月的产品总出现次数
  • YTD(年初至今)通常意味着包括从年初到给定时间点的所有内容。这是你想要的吗?或者您只是想要每个月的简单总数?如果是后者,那将简化我原来的答案。

标签: sql teradata teradata-sql-assistant


【解决方案1】:

我确信有一种更清洁的方法可以做到这一点,但这可能会奏效:

SELECT 
  src.mem_nbr, 
  MAX(src.first_name) AS first_name,
  MAX(src.last_name) AS last_name,
  MAX(src.product_desc) AS product_desc,
  src.year_month AS fill_date, 
  MAX(src.cum_cnt_yearly) AS ytd_per_month,
  MAX(uc.uniq_prd_cnt) AS uniq_prd_cnt
FROM (
  SELECT dmc.mem_nbr, dd.year_month, dmc.first_name, dmc.last_name, p.product_desc,
    CASE 
      WHEN CAST ((CURRENT_DATE - dob.date_date) / 365.25 AS INTEGER) >= 18  THEN '18+' 
      ELSE 'Less than 18' 
    END AS mem_age,
    COUNT(fc.product_nbr) OVER(
      PARTITION BY dmc.mem_nbr, <dd.year>
      ORDER BY dd.year_month
      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) cum_cnt_yearly -- cumulative yearly row count
  FROM ft_product_claim fc -- product claims
  LEFT JOIN dim_product p ON fc.product_dim_ck = p.product_dim_ck -- product
  LEFT JOIN dim_member dmc ON dmc.member_dim_ck = fc.member_dim_ck -- member
  INNER JOIN dim_date dd ON dd.date_dim_ck = fc.product_date_dim_ck -- prod date
  INNER JOIN dim_date dob ON dob.date_dim_ck = dmc.birth_date_dim_ck -- birth date
  INNER JOIN tbl_product pd ON fc.product_nbr = pd.<prod_nbr> -- valid product
  WHERE year_month BETWEEN 202001 AND 202002
  AND mem_age = '18+'
) src
LEFT JOIN (
  SELECT dmc.mem_nbr, COUNT(DISTINCT fc.product_nbr) uniq_prd_cnt
  FROM ft_product_claim fc -- product claims
  INNER JOIN dim_member dmc ON fc.member_dim_ck = dmc.member_dim_ck -- member info
  GROUP BY dmc.mem_nbr
) uc ON src.mem_nbr = uc.mem_nbr -- unique count
GROUP BY src.mem_nbr, src.fill_date;

假设:

  • 您想获取ft_product_claim 中的行数
  • 您的所有联接都是 1-1 联接
  • tbl_product 有一个匹配的 &lt;prod_nbr&gt; 字段
  • dim_date 有一个 &lt;dd.year&gt; 字段,否则您必须使用表达式来提取它

几个观察:

  1. 除非你需要所有字段,否则你不应该使用SELECT *,在这种情况下你不需要;我什至不知道它是否会按原样工作。我将WHERE FC.PRODUCT_NBR IN (...) 转换为INNER JOIN

  2. 如果您知道dim_productdim_member 中始终有匹配的行,请将这些连接更改为INNER JOINs。

【讨论】:

  • 你是否忘记关闭某些东西“ uc ON src.mem_nbr =”
  • 哎呀,你是对的。我更新了它。这行得通吗?
  • 是的,它的工作原理仍然需要做一些改进谢谢!
  • 太棒了!乐于助人:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
相关资源
最近更新 更多