【Sql Server】基础之统计库龄语句,仅作为语句使用

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 知识点的综合使用分组、数据转换、Case when then、max、min、count、sum、left join多表关联等知识点


作者:小5聊基础

简介:一只喜欢全栈方向的程序员,欢迎咨询,尽绵薄之力答疑解惑

编程原则:Write Less Do More

    • 知识点
    编号 知识点 说明
    1 group by 对某个表字段进行分组
    2 convert

    数据类型转换  

    3 case when then else end 逻辑判断
    4 max 最大值
    5 min 最小值
    6 count 记录数
    7 sum 统计值,综合
    8 left join 左链接

    1、知识点

    1)group by

    此处以商品编号进行分组

    select shopid from stock group by shopid

    image.gif

    image.gif编辑2)

    2)convert

    数据类型转换,varchar(10)和120,datetime时间数据类型转为字符串,并只显示10位长度值,刚好就是yyyy-MM-dd

    select convert(varchar(10),timevalue,120) as timevalue from stock

    image.gif

    image.gif编辑

    2、创建表

    USE [test]
    GO
    /****** Object:  Table [dbo].[stock]    Script Date: 04/17/2022 10:52:02 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[stock](
      [typeValue] [varchar](50) NULL,
      [shopid] [int] NULL,
      [timevalue] [datetime] NULL,
      [stockValue] [int] NULL
    ) ON [PRIMARY]
    GO
    SET ANSI_PADDING OFF
    GO

    image.gif

    3、表添加记录

    模拟一定量的记录进行测试

    --truncate table stock
    /*
    insert into stock(typeValue,shopid,timevalue,stockValue)
    values('入库',123,'2020-01-01',100)
    insert into stock(typeValue,shopid,timevalue,stockValue)
    values('入库',234,'2020-01-02',100)
    insert into stock(typeValue,shopid,timevalue,stockValue)
    values('出库',123,'2020-01-03',50)
    insert into stock(typeValue,shopid,timevalue,stockValue)
    values('出库',234,'2020-01-04',50)
    insert into stock(typeValue,shopid,timevalue,stockValue)
    values('出库',123,'2020-01-05',50)
    insert into stock(typeValue,shopid,timevalue,stockValue)
    values('出库',234,'2020-01-06',50)
    insert into stock(typeValue,shopid,timevalue,stockValue)
    values('入库',123,'2020-01-07',100)
    insert into stock(typeValue,shopid,timevalue,stockValue)
    values('入库',234,'2020-01-08',100)
    insert into stock(typeValue,shopid,timevalue,stockValue)
    values('出库',123,'2020-01-09',30)
    insert into stock(typeValue,shopid,timevalue,stockValue)
    values('出库',234,'2020-01-10',30)
    */

    image.gif

    4、查询代码

    /*
    编号123,还存在库存,则使用上次进货时间2020-01-11和2020-02-20相差,就是40天
    编号234,还存在库存,则使用上次进货时间2020-01-11和2020-02-20相差,就是41天'
    */
    declare @searchTime varchar(50)
    set @searchTime='2020-02-20'
    select a.shopid as 商品编号,
    convert(varchar(10),a.inMaxTime,120) as 上次进货时间,
    @searchTime as 搜索时间,
    (case when (a.totalInValue-b.totalOutValue)>0 
    then datediff(day, a.inMaxTime, @searchTime) --还有库存,则用上次进货时间计算
    else datediff(day, b.outMaxTime, @searchTime) end) as 库龄, --没有库存了,使用最后一次出库时间计算
    (a.totalInValue-b.totalOutValue) as '库存',
    (case when (a.totalInValue-b.totalOutValue)>0 then '还有库存' else '已出完' end) as 是否出库完
    from(
        --先按商品编号分组,并筛选入库值和统计入库总值
        --出库最小得时间
        select shopid,
        min(timevalue) as inMinTime, --入库最小时间
        max(timevalue) as inMaxTime, --入库最大时间(上次进货时间)
        sum(stockValue) as totalInValue,
        count(1) as inCount
        from stock 
        where typeValue='入库' and timevalue<=@searchTime
        group by shopid
    ) as a
    left join(
        select shopid,
        min(timevalue) as outMinTime, --出库最小时间
        max(timevalue) as outMaxTime, --出库最大时间
        sum(stockValue) as totalOutValue  --出库总数
        from stock where typeValue='出库' and timevalue<=@searchTime
        group by shopid
    ) as b
    on a.shopid=b.shopid

    image.gif


    相关实践学习
    使用SQL语句管理索引
    本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
    SQL Server on Linux入门教程
    SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
    相关文章
    |
    3天前
    |
    SQL IDE Java
    Java连接SQL Server数据库的详细操作流程
    Java连接SQL Server数据库的详细操作流程
    |
    11天前
    |
    SQL DataWorks NoSQL
    DataWorks产品使用合集之如何将SQL Server中的数据转存到MongoDB
    DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
    241 1
    |
    16天前
    |
    SQL 关系型数据库 MySQL
    怎么通过第三方库实现标准库`database/sql`的驱动注入?
    在Go语言中,数据库驱动通过注入`database/sql`标准库实现,允许统一接口操作不同数据库。本文聚焦于`github.com/go-sql-driver/mysql`如何实现MySQL驱动。`database/sql`提供通用接口和驱动注册机制,全局变量管理驱动注册,`Register`函数负责添加驱动,而MySQL驱动在`init`函数中注册自身。通过这个机制,开发者能以一致的方式处理多种数据库。
    |
    16天前
    |
    SQL 关系型数据库 MySQL
    mysql sql语句删除一个库下的所有表
    mysql sql语句删除一个库下的所有表
    |
    4天前
    |
    SQL 存储 关系型数据库
    关系型数据库中的SQL Server
    【6月更文挑战第11天】
    41 3
    |
    3天前
    |
    SQL IDE Java
    Java连接SQL Server数据库的详细操作流程
    Java连接SQL Server数据库的详细操作流程
    |
    4天前
    |
    SQL 弹性计算 API
    云服务器 ECS产品使用问题之如何通过API调用阿里云服务器上SQL Server数据库中的数据
    云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
    |
    11天前
    |
    SQL 存储 数据库
    sql2005恢复数据库
    在SQL Server 2005中恢复数据库涉及多个步骤:登录到SSMS,右键点击“数据库”选择“任务”→“还原”→“数据库”;指定备份源,选择需要的.bak文件;确认还原选项,如覆盖现有数据库;开始还原,等待完成;验证数据的完整性和准确性;如有必要,处理实例编号问题。记得先备份,确保足够磁盘空间,并在遇到问题时参考官方文档。
    |
    23天前
    |
    SQL 数据库
    sql2005恢复数据库
    在 SQL Server 2005 中恢复数据库通常涉及使用备份文件。以下是一般步骤的概述,用于从备份中恢复数据库: 1. **启动 SQL Server Management Studio (
    19 1
    |
    26天前
    |
    SQL BI HIVE
    【Hive SQL 每日一题】统计用户留存率
    用户留存率是衡量产品成功的关键指标,表示用户在特定时间内持续使用产品的比例。计算公式为留存用户数除以初始用户数。例如,游戏发行后第一天有10000玩家,第七天剩5000人,第一周留存率为50%。提供的SQL代码展示了如何根据用户活动数据统计每天的留存率。需求包括计算系统上线后的每日留存率,以及从第一天开始的累计N日留存率。通过窗口函数`LAG`和`COUNT(DISTINCT user_id)`,可以有效地分析用户留存趋势。