【问题标题】:how to display a weekday(set it to zero) of datepart function when there are no occurence of the day in the table当表格中没有出现日期时,如何显示 datepart 函数的工作日(将其设置为零)
【发布时间】:2017-06-12 13:07:12
【问题描述】:

七夕

我的数据库中有一个销售和商店登记表。有些商店周日不营业,所以当天没有销售

我有以下查询代码来获取销售数量

SELECT DATENAME(WEEKDAY, [Data_Hora_Ficheiro_fim]),[Store_id],count([sales_no])
  FROM [GPOS].[dbo].[V_Period_stats_with_CAE_GC]
       group by [Store_id],[Store name],DATEPART(WEEKDAY,[Data_Hora_Ficheiro_fim])DATENAME(WEEKDAY, [Data_Hora_Ficheiro_fim])
  order by DATEPART(WEEKDAY, [Data_Hora_Ficheiro_fim]),DATENAME(WEEKDAY, [Data_Hora_Ficheiro_fim]),[Store_id]

查询将类似于(store 4 close on Sunday)

day         Storeid    num_sales
----------|--------|----------
Monday      3        90
Tuesday     3        70  
Wednesday   3        20
Thursday    3        60
Friday      3        96
Saturday    3        98
Sunday      3        200  
Monday      4        90
Tuesday     4        70  
Wednesday   4        20
Thursday    4        60
Friday      4        96
Saturday    4        98 

所以我需要对查询进行哪些更改才能输出还包括该行

Sunday    4        0

提前致谢

【问题讨论】:

    标签: sql sql-server tsql sql-server-2012 datepart


    【解决方案1】:

    一种方法是交叉加入工作日和不同的store_id 以获得两者的所有组合,并left join 您的视图。

    第一部分使用common table expressionTable Value Constructor (Transact-SQL)

    ;with Weekdays as (
      select 
          day=datename(weekday, convert(datetime,t.n)) 
        , s.Store_id
      from (values(0),(1),(2),(3),(4),(5),(6)) t(n)
        cross join (
          select distinct Store_id
          from [gpos].[dbo].[V_Period_stats_with_cae_gc]
          ) s
    )
    select 
        w.day
      , w.[Store_id]
      , count(v.[sales_no])
    from Weekdays w
      left join [gpos].[dbo].[V_Period_stats_with_cae_gc] v
        on w.day = datename(weekday, v.[Data_Hora_Ficheiro_fim])
       and w.Store_id = v.Store_id
    group by 
        w.day
        w.Store_id
    order by 
        w.day
      , w.Store_id
    

    rextester 演示(针对提供的示例数据进行了修改):http://rextester.com/JZLF76266

    返回:

    +-----------+---------+-----------+
    |    day    | storeid | num_sales |
    +-----------+---------+-----------+
    | Monday    |       3 |        90 |
    | Tuesday   |       3 |        70 |
    | Wednesday |       3 |        20 |
    | Thursday  |       3 |        60 |
    | Friday    |       3 |        96 |
    | Saturday  |       3 |        98 |
    | Sunday    |       3 |       200 |
    | Monday    |       4 |        90 |
    | Tuesday   |       4 |        70 |
    | Wednesday |       4 |        20 |
    | Thursday  |       4 |        60 |
    | Friday    |       4 |        96 |
    | Saturday  |       4 |        98 |
    | Sunday    |       4 |         0 |
    +-----------+---------+-----------+
    

    如果您有一个表,其中 store_id 是唯一的(例如 dbo.Store),那么这将是 select distinct Store_id ... 的替代来源。

    另一种选择是使用限制在您感兴趣的日期范围内的日历表与Store_id 交叉连接。这将允许您加入实际的 date 数据类型而不是 datename() 函数,这可以提高性能。

    数字和日历表参考:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多