全天各个时间段产品销量情况统计

数据库环境:SQL SERVER 2005

现有一个产品销售实时表,表数据如下:

字段name是产品名称,字段type是销售类型,1表示售出,2表示退货,字段num是数量,字段ctime是操作时间。

要求:

  在一行中统计24小时内所有货物的销售(售出,退货)数据,把日期考虑在内。

分析:

  这实际上是行转列的一个应用,在进行行转列之前,需要补全24小时的所有数据。补全数据可以通过系统的数字辅助表

spt_values来实现,进行行转列时,根据type和处理后的ctime分组即可。

1.建表,导入数据

CREATE TABLE snake (name VARCHAR(10 ),type INT,num INT, ctime DATETIME )
INSERT INTO snake VALUES(‘ 方便面‘, 1,10 ,‘2015-08-10 16:20:05‘)
INSERT INTO snake VALUES(‘ 香烟A ‘, 2,2 ,‘2015-08-10 18:21:10‘)
INSERT INTO snake VALUES(‘ 香烟A ‘, 1,5 ,‘2015-08-10 20:21:10‘)
INSERT INTO snake VALUES(‘ 香烟B‘, 1,6 ,‘2015-08-10 20:21:10‘)
INSERT INTO snake VALUES(‘ 香烟B‘, 2,9 ,‘2015-08-10 20:21:10‘)
INSERT INTO snake VALUES(‘ 香烟C‘, 2,9 ,‘2015-08-10 20:21:10‘)

2.补全24小时的数据

/*枚举0-23自然数列*/
WITH    x0
          AS ( SELECT   number AS h
               FROM     master..spt_values
               WHERE    type = ‘P‘
                        AND number >= 0
                        AND number <= 23
             ),/*找出表所有的日期*/
        x1
          AS ( SELECT DISTINCT
                        CONVERT(VARCHAR(100), ctime, 23) AS d
               FROM     snake
             ),/*补全所有日期的24小时*/
        x2
          AS ( SELECT   x1.d ,
                        x0.h
               FROM     x1
                        CROSS JOIN x0
             ),
        x3
          AS ( SELECT   name ,
                        type ,
                        num ,
                        DATEPART(hour, ctime) AS h
               FROM     snake
             ),/*整理行转列需要用到的数据*/
        x4
          AS ( SELECT   x2.d ,
                        x2.h ,
                        x3.name ,
                        x3.type ,
                        x3.num
               FROM     x2
                        LEFT JOIN x3 ON x3.h = x2.h
             )

3.行转列

SELECT  ISNULL([0], 0) AS [00] ,
            ISNULL([1], 0) AS [01] ,
            ISNULL([2], 0) AS [02] ,
            ISNULL([3], 0) AS [03] ,
            ISNULL([4], 0) AS [04] ,
            ISNULL([5], 0) AS [05] ,
            ISNULL([6], 0) AS [06] ,
            ISNULL([3], 7) AS [07] ,
            ISNULL([8], 0) AS [08] ,
            ISNULL([9], 0) AS [09] ,
            ISNULL([10], 0) AS [10] ,
            ISNULL([3], 11) AS [11] ,
            ISNULL([12], 0) AS [12] ,
            ISNULL([13], 0) AS [13] ,
            ISNULL([14], 0) AS [14] ,
            ISNULL([3], 15) AS [15] ,
            ISNULL([16], 0) AS [16] ,
            ISNULL([17], 0) AS [17] ,
            ISNULL([18], 0) AS [18] ,
            ISNULL([19], 15) AS [19] ,
            ISNULL([20], 0) AS [20] ,
            ISNULL([21], 0) AS [21] ,
            ISNULL([22], 0) AS [22] ,
            ISNULL([23], 15) AS [23] ,
            type ,
            d AS date
    FROM    ( SELECT    d ,
                        h ,
                        type ,
                        num
              FROM      x4
            ) t PIVOT( SUM(num) FOR h IN ( [0], [1], [2], [3], [4], [5], [6],
                                           [7], [8], [9], [10], [11], [12],
                                           [13], [14], [15], [16], [17], [18],
                                           [19], [20], [21], [22], [23] ) ) t
    WHERE   type IS NOT NULL

来看一下最终效果,只有1天的数据,可能看起来不是很直观。

本文的技术点有2个:

  1.利用数字辅助表补全缺失的记录

  2.pivot行转列函数的使用

时间: 2024-08-05 13:05:31

全天各个时间段产品销量情况统计的相关文章

使用R语言预测产品销量

使用R语言预测产品销量 通过不同的广告投入,预测产品的销量.因为响应变量销量是一个连续的值,所以这个问题是一个回归问题.数据集共有200个观测值,每一组观测值对应一种市场情况. 数据特征 TV:对于一个给定市场的单一产品,用于电视上的广告费用(以千为单位) Radio:用于广告媒体上投资的广告费用 Newspaper:用于报纸媒体上的广告费用 响应 Sales:对应产品的销量 加载数据 > data <- read.csv("http://www-bcf.usc.edu/~garet

影响食品企业产品销量提升的100个营销要素

作者:北京精准联合企划有限公司首席策划  丁华 食品企业面对的竞争压力会越来越大 抛开目前这种严峻的大经济气候不说,食品企业不同品类的产品,在不同层级.不同区域市场所面临的竞争压力与日俱增.从今年春节城乡礼品市场的主流产品中不难看出,不仅大中型知名食品企业的营销水平.产品品质在快速进步,价格定位更贴近消费者的购买心理,连一些农村市场地方小型食品企业的产品也是包装精美.口味独特.卖点突出.定价准确.可以预见,今年食品企业面对的竞争压力会越来越大,不与时俱进只能是死路一条. 走专业营销策划之路是食品

Oracle EBS-SQL (PO-16):检查采购订单完成情况统计.sql

select         e.FULL_NAME                                                     采购员,         sum(plla.quantity-plla.QUANTITY_CANCELLED)  订购数量,         sum(plla.Quantity_Received)                           完成数量 ,         round(SUM(plla.Quantity_Receive

--投资情况统计详情sql

--投资情况统计详情sqlselect BidRecord.*, RegInfo.UserName,UserInfo.phone,BorrowInfo.Title,BorrowInfo.BorrowCode from--(select * from [YYD_Account_MoneyRecord] where moneytype='参与投标' and state=1) as MoneyRecord(select * from YYD_Borrow_BidRecord where status=

华为OJ训练题之 比赛情况统计

题目如下: 比赛情况统计 有一个游戏平台,各个参赛队伍(以唯一的TeamID来标识)之间进行单循环的对抗赛,两个队伍之间只举行一场比赛,比赛以得分的多少定胜负.需要完成一个统计赛况的程序,能够随时查询指定队伍的最新赛况:包括胜.平.负的局数,当前总积分以及名次. 说明:循环赛没有全部结束时也可以查询某个队伍的最新赛况 规则说明 比赛判定:两个队伍中得分高的一方为胜者,另一方为负者:得分相同则为平局 积分规则:每一局比赛: 胜者积3分;平局双方各积1分; 负者积0分 排名规则:按照当前总积分的高低

项目开发容易出错情况统计

2016年11月17日 11:30:45 星期四 1.适配: a) APP弹窗大屏幕适配(例如, 是否居中) 2.按钮状态: a) 按钮点击后没有disable 如果新页面加载卡顿导致用户多次点击,生成多次请求 b) 按钮disable后什么时候enable(例如,输入错误,接口返回error,按钮要重新enable) c) 按钮置灰与disable 3.下拉刷新: a) 要明确哪些页面是需要哪些是不需要的(虽然下拉刷新是行规) 4.初始值.默认值: a) 编辑页面时,要初始化默认值(例如, 日

国际化产品的百度统计与谷歌统计

最近在主导重构公司一款国际化产品,需要进行埋点统计,具体需求是工程里面的事件分析根据国内/国外进行统计,海外版的使用谷歌统计,国内版的采用百度统计.采用的是同一套工程代码,所以只需要写一个方法,里面根据配置文件的平台属性来做区分是百度统计还是谷歌统计,代码总结如下: ;(function (win) { var config = win.SYSTEM_CONFIG; var statistics = function () { }; if (config && (config.baidu

Office 365 Licence使用情况统计

负责采购的同事需要知道目前公司使用了多少License,但是通过O365控制台界面似乎无法直接导出License使用量的信息,于是让我帮忙从后台统计一下. $mail_text = Read-Host "输入你的Office 365邮箱:" $pw_text = Read-Host "输入你的Office 365密码:" $pw = ConvertTo-SecureString $pw_text -AsPlainText -Force $creds = New-Ob

服务器资源使用情况统计--脚本

[[email protected] sjx]# cat per-html.sh #!/bin/bash perf () { # #    Size        Used        Avail        Use% # echo '<table border="0">' echo '<thead align="right">' echo -e "<tr>\n\t<th colspan='"5&qu