【问题标题】:Including NULL results as Zero when using COUNT and SUM使用 COUNT 和 SUM 时将 NULL 结果包括为零
【发布时间】:2013-04-22 13:15:48
【问题描述】:

我对 SQL 完全陌生,我正在努力从销售点软件创建数据馈送以供第三方分析。以下是将上传到数据馈送的 CSV 的要求:

.CSV 文件应包含具有以下值的行: STORE ID 表示唯一的商店标识符(即 Store1),并应包括您的连锁店名称(与文件名的格式相同)和特定的商店编号。逗号前后不应包含任何空格或标点符号。

-MM/DD/YYYY 格式的日期

-HH 对应于使用 24 小时制的适当小时(0-23,0 表示午夜到凌晨 1 点)。

- COUNT 值是特定操作小时的事务计数,如上一节中所定义。

-SALES DOLLARS 值对应于该小时内累计的销售额,如上一节中所定义。请注意,不能使用逗号作为千位分隔符或美元符号。

-TRAFFIC PLACEHOLDER 是必填字段,但应保留为 0 值。

样本输出

Wxyz434,02/28/2011,13,56,446.34,0

Wxyz434,02/28/2011,14,61,482.28,0

Wxyz434,02/28/2011,15,63,382.80,0

我已经能够在我的 POS 软件的数据导出实用程序中找到这些表,并且我使用了这个 SQL 查询:

/***** Script for Headcount Data *****/
select [STR_ID]
  ,[BUS_DAT]
  ,[TKT_TIM_HR]
              ,COUNT ([TKT_NO])
  ,SUM ([SAL_TOT])

from MyData.dbo.VI_PS_TKT_HIST
where BUS_DAT between '04-24-2013 00:00:00' and '04-24-2013 11:59:59' and 
TKT_TIM_HR between '10' and '19'

group by BUS_DAT, STR_ID, TKT_TIM_HR

部分结果:

"STR_ID","BUS_DAT","TKT_TIM_HR","Field","Field_1"

"1","4/24/2013 12:00:00.000 AM",19,1,270.27

"11","4/24/2013 12:00:00.000 AM",10,1,32.95

"11","4/24/2013 12:00:00.000 AM",12,4,229.24

"11","4/24/2013 12:00:00.000 AM",13,1,137.28

您会注意到 TKT_TIM_HR 是处理工单的小时数,并且在 11 小时内没有处理任何工单。

如何修改查询,以便在 11 小时内存在一行,即使没有门票/销售号码存在? (把NULL算为零??)

非常感谢您的帮助,

泰勒

【问题讨论】:

  • 仅供参考,您要实现的目标称为filling gaps in sparse data,通常最好通过partitioned outer join 到一个表(或查询)中完成,该表列出了您需要的范围内的每天/小时组合.您使用的是什么 RDBMS?是mysqloraclesqlite等吗?
  • 请注意,如果partitioned outer join 不可用,您可以在日期和小时表上使用left outer join
  • 谢谢汤米。我可以访问 SQL Server Studio 2008 R2,但是该脚本用于从 POS 软件本身(Counterpoint SQL)生成数据导出。

标签: sql count null


【解决方案1】:

您需要创建一个“日历”关系以用作子查询,该子查询可以是 LEFT OUTER JOIN 的 LHS。如果您只需要按小时报告,则可以这样做:

select [Hour], AmPm
from (
  select Hour= 1 union all select  2 union all select  3 union all select  4 union all
  select Hour= 5 union all select  6 union all select  7 union all select  8 union all
  select Hour= 9 union all select 10 union all select 11 union all select 12 
) H
cross join ( select AmPm = 'am' union all select 'pm'
) T
order by AmPm,[Hour]

【讨论】:

  • 谢谢彼得,我会试试这个。如果 Hour 是两位数的 24 小时格式,我只需继续 union all select 直到生成所有 24?
  • 或者,在这种情况下,您可能只想 (a) 将 AmPm 更改为 * 2; (b) 将 1 改为 12 变为 0 至 11;给自己从 0 到 23 的时间,少一点冗长。如果您发现自己重复使用它,请将其构建为数据库中的表。最好的感谢当然是投票或接受。
【解决方案2】:

如果您可以使用,最简单的方法是将列设置为不允许空值并具有默认值 0。

【讨论】:

  • 谢谢丹。不幸的是我不能修改数据库本身,只能查询它。另外,没有另一个表包含 TKT_TIM_HR,所以使用 LEFT JOIN 会有问题吗?
  • 左连接不会有问题。
  • 再次感谢,丹。我无法找到有关在已选择的列上使用左连接的信息。如果我从第一个查询中删除它,我是否将左连接添加为第二个 SELECT TKT_TIM_HR FROM MYDATA.dbo.VI_PS_TKT_HIST?如果在其他地方有容易找到的答案,我深表歉意,我已经研究了三天,我的大脑有点炸了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多