【问题标题】:Running Total - Create row for months that don't have any sales in the region (1 row for each region in each month)运行总计 - 为该地区没有任何销售的月份创建行(每个月每个地区 1 行)
【发布时间】:2020-07-28 20:17:45
【问题描述】:

我正在处理以下查询,我将在 Tableau 中使用该查询来创建一个按年份进行颜色编码的折线图,并将该区域用作用户的过滤器。查询有效,但我发现在没有任何销售的地区有几个月。这些部分分解了折线图,我无法填写缺失的空格(我在 X 轴上使用非日期维度 - 直到其财政年度结束的月数)。

我正在寻找一些帮助来更改我的查询,以便为我的数据集中的每个月和每个区域创建一行,以便我的运行总计将有一个值显示在折线图中。如果我的表中没有值,则 = 0 并更新该区域的运行总计。

我有一个 dimDate 表和一个可以在查询中使用的 Regions 表。

现在我的查询,(结果在 Excel 中排序以便查看)Results Table Now

我想做什么;以黄色突出显示的新行What I want to do

我使用 SQL Server 的代码:

SELECT b.gy, 
       b.sales_month, 
       b.region, 
       b.gs_year_total, 
       b.months_away,  
       Sum(b.gs_year_total) 
         OVER ( 
           partition BY b.gy, b.region 
           ORDER BY b.months_away DESC) RT_by_Region_GY 
FROM   (SELECT a.gy, 
               a.region, 
               a.sales_month, 
               Sum(a.gy_total) Gs_Year_Total, 
               a.months_away 
        FROM   (SELECT g.val_id, 
                       g.[gs year]                                        AS GY 
                       , 
                       g.sales_month 
                       AS 
                       Sales_Month, 
                       g.gy_total, 
                       Datediff(month, g.sales_month, dt.lastdayofyear) AS 
                       months_away, 
                       g.value_type, 
                       val.region 
                FROM   uv_sales g 
                       JOIN dbo.dimdate AS dt 
                         ON g.[gs year] = dt.gsyear 
                       JOIN dimvalsummary val 
                         ON g.val_id = val.val_id 
                WHERE  g.[gs year] IN ( 2017, 2018, 2019, 2020, 2021 ) 
                GROUP  BY g.valuation_id, 
                          g.[gs year], 
                          val.region, 
                          g.sales_month, 
                          dt.lastdayofyear, 
                          g.gy_total, 
                          g.value_type) a 
        WHERE  a.months_away >= 0 
               AND sales_month < Dateadd(month, -1, Getdate()) 
        GROUP  BY a.gy, 
                  a.region, 
                  a.sales_month, 
                  a.months_away) b

【问题讨论】:

标签: sql sql-server


【解决方案1】:

很难想象没有数据和所有这些领域的意义的最佳解决方法。这是一个如何尝试解决它的粗略草图。抱歉,这不完整或未经过测试,但我不确定所有这些字段的含义,也没有要测试的数据。

创建一个名为 all_months 的表,并插入从最早到未来任何日期的所有月份。

    01/01/2017
    02/01/2017
    ... 
    12/01/2049

每个区域可能需要一个查询并将它们合并在一起。从该 all_months 表中选择年份和月份,然后在月份左连接到您的另一个表。合并您的美元价值。

    select 'East' as region, 
    extract(year from m.month) as gy_year, 
    m.month as sales_month, 
    coalesce(g.gy_total, 0) as gy_total, 
    datediff(month, m.month, dt.lastdayofyear) as months_away
    from all_months m
    left join uv_sales g on g.sales_month = m.month
    --and so on

【讨论】:

  • 很抱歉缺少数据和意义。我通常会尝试用我的问题创建示例数据,但在这种情况下,我正在寻找你的建议......我的高级计划。我确实有一个包含所有日期的 dimDate 表,还有一个包含我所有区域的区域表。我将从这个开始,然后按照你的大纲进行。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
相关资源
最近更新 更多