2019-05-21 SQL学习

SQL学习

新建模板小书匠

  • sqlserver 动态计算
  • sqlserver decimal转为varchar
  • mysql 组内分组排序

sqlserver 动态计算

2019年02月28日 18时56分22秒


--模拟数据
IF OBJECT_ID(‘tempdb..#t‘)>0 DROP TABLE #t
SELECT * INTO #t
FROM (
SELECT ‘1‘ id,2030 g,265 h, 830 k,‘g*h+h*k‘ gs,0 tt
UNION ALL
SELECT ‘2‘ id,2030 g,0 h, 0 k,‘g*4‘ gs,0 tt
UNION ALL
SELECT ‘3‘ id,2030 g,265 h, 0 k,‘(g+h)*2‘ gs,0 tt
UNION ALL
SELECT ‘4‘ id,2030 g,265 h, 0 k,‘(g+h)*2‘ gs,0 tt)t
--原始数据
SELECT * FROM #t

--按公式类别分类
IF OBJECT_ID(‘tempdb..#tt‘)>0 DROP TABLE #tt
SELECT ROW_NUMBER()OVER(ORDER BY gs)rowid
,gs
INTO #tt
FROM #t
GROUP BY gs

--变量
DECLARE @i int,@n INT
DECLARE @gs VARCHAR(50)
DECLARE @sql VARCHAR(MAX)
--按公式类别遍历
SELECT @i=MIN(rowid),@n=MAX(rowid) FROM #tt
WHILE(@i<[email protected])
BEGIN
SELECT @gs=gs FROM #tt WHERE rowid[email protected]
SET @sql=‘update #t set tt=‘[email protected]+‘ where gs=‘‘‘[email protected]+‘‘‘‘--生成脚本
EXEC(@sql)--执行脚本,可以print看效果
SET @[email protected]+1
END
--处理后效果
SELECT * FROM #t

drop table #t

2019年03月15日 19时09分48秒
实际的动态计算
需要注意一下几点,@gs 变量的长度,一定要大于公式字段最长的长度。
第二个需要注意的点是,存放结果的字段一定要是够大的浮点型,如果是使用数字新建的话,可用 100000.0000 代替。


    --模拟数据
IF OBJECT_ID(‘tempdb..#t‘)>0 DROP TABLE #t 

SELECT
a.store_no
,a.contract_no
,a.contract_area
,a.real_area
,a.product_no  -- ‘ COMMENT ‘套餐编号[inco1]‘,
-- ,a.id -- ’设计空间实例id‘,
,a.design_case_no --   ‘设计实例编码‘,
,a.case_space_name --   ‘空间实例名‘,
,a.case_space_no --   ‘空间实例编码‘,
,a.space_no --   ‘空间编码‘,
,a.no -- ‘相同空间的编号(比如 WS1,WS2,WS3 后面的数字)‘,
,a.design_case_id -- ‘设计实例id‘,
,a.sort_val -- ‘排序‘,
,a.area BL_SCMJ-- ‘实测面积‘,
,a.girth BL_KJZC-- ‘周长‘,
,a.height BL_KJCG-- ‘层高‘,
,a.is_balcony -- ‘是否关联阳台:0:无,1:有‘,
,a.remain_area -- ’可用墙面积‘,
,a.state -- ‘1:已完成,2.未完成‘,
,a.relation_space_no --   ‘关联空间实例编码 ‘,
,a.added -- ‘1:户型外添加的空间 2:户型内的空间 ‘,
-- ,b.store_no
-- ,b.package_no
-- ,b.cp_combo_name
-- ,b.space_no
,b.work_item_no
,b.work_item_name
,b.dimension_no
-- ,b.stand_choose
-- ,b.dimension_name
,b.dimension_val
,c.bl_sgl bl_sgl_1
,case when c.bl_sgl = ‘SCCG‘ then a.height*c.sgl_num when c.bl_sgl=‘SCZC‘ then a.girth*c.sgl_num when c.bl_sgl=‘SCQM‘ then a.remain_area*c.sgl_num when c.bl_sgl=‘SCMJ‘ then a.area*c.sgl_num else c.bl_sgl end BL_SGL
,c.sgl_num
,c.job_place
,c.job_place_no
,d.goods_no
,d.goods_name
,d.category_no
,d.length JC_SKU_length
,d.width JC_SKU_width
,d.height goods_height
,d.base_unit
,d.normal_num -- 标配数量
,d.attrition_rate JC_SHL-- 损耗率
,d.function_content1 gs -- 施工量和用量转化公式
, 10000000000.0000 tt
into #t
FROM
    Fact_Design_Case_Space a
LEFT JOIN dim_03_stand_package b ON a.store_no = b.store_no  -- 关联标准套餐表,出来标准套餐所需要的施工项
AND a.product_no = b.package_no
AND a.space_no = b.space_no
LEFT JOIN (select * from dim_03_stand_work_item where is_suit = 1) c -- 关联标准施工量,得到每个施工项的施工量。
ON b.work_item_no = c.work_item_no
LEFT JOIN Fact_Design_House_Space_Goods d -- 根据城市-施工项-选材维度确定商品
on a.store_no = d.store_no and b.work_item_no = d.work_item_no  and b.dimension_no  = d.dimension_no
WHERE
    a.contract_no = ‘DD20180602001060‘

--原始数据
SELECT * FROM #t 

--按公式类别分类
IF OBJECT_ID(‘tempdb..#tt‘)>0 DROP TABLE #tt
SELECT ROW_NUMBER()OVER(ORDER BY gs)rowid
,gs
INTO #tt
FROM #t
where gs is not null
GROUP BY gs
 select * from #tt

--变量
DECLARE @i int,@n INT
DECLARE @gs VARCHAR(100)
DECLARE @sql VARCHAR(MAX)
--按公式类别遍历
SELECT @i=MIN(rowid),@n=MAX(rowid) FROM #tt
WHILE(@i<[email protected])
BEGIN
SELECT @gs=gs FROM #tt WHERE rowid[email protected]
print @i
SET @sql=‘update #t set tt=‘[email protected]+‘ where gs=‘‘‘[email protected]+‘‘‘‘--生成脚本 

print @sql

EXEC(@sql)--执行脚本,可以print看效果
/*
*/
SET @[email protected]+1
END 

--处理后效果
SELECT * FROM #t 

drop table #t
drop table #tt
-- 向上取整数 CEILING

select a.*,b.* from
(select a.*,CEILINg(a.tt) as use_num from #t a) a
left join Fact_Sale_price b
on a.store_no=b.store_no and a.goods_no = b.goods_no

sqlserver decimal转为varchar

因为 decimal 格式的有小数位,cast 函数只能将他变成 10.0000 的形式,因此还需要替换掉的后面的。

select replace(cast(101.00000000 as varchar(100)),‘.00000000‘,‘‘) store_no 

mysql 组内分组排序



SELECT
    a.*, count(1) AS rank
FROM
    (select 1 as id,‘aaa‘ as name ,1 as category_id union all
select 2 as id,‘bbb‘ as name ,2 as category_id union all
select 3 as id,‘ccc‘ as name ,1 as category_id union all
select 4 as id,‘ddd‘ as name ,2 as category_id union all
select 5 as id,‘eee‘ as name ,1 as category_id
) a
LEFT JOIN (select 1 as id,‘aaa‘ as name ,1 as category_id union all
select 2 as id,‘bbb‘ as name ,2 as category_id union all
select 3 as id,‘ccc‘ as name ,1 as category_id union all
select 4 as id,‘ddd‘ as name ,2 as category_id union all
select 5 as id,‘eee‘ as name ,1 as category_id
) b ON a.category_id = b.category_id
AND a.id <= b.id
GROUP BY
    a.category_id,
    a.id
ORDER BY
    a.category_id,
    a.id DESC

SELECT
    *
FROM
    (select 1 as id,‘aaa‘ as name ,1 as category_id union all
select 2 as id,‘bbb‘ as name ,2 as category_id union all
select 3 as id,‘ccc‘ as name ,1 as category_id union all
select 4 as id,‘ddd‘ as name ,2 as category_id union all
select 5 as id,‘eee‘ as name ,1 as category_id
) a
LEFT JOIN (select 1 as id,‘aaa‘ as name ,1 as category_id union all
select 2 as id,‘bbb‘ as name ,2 as category_id union all
select 3 as id,‘ccc‘ as name ,1 as category_id union all
select 4 as id,‘ddd‘ as name ,2 as category_id union all
select 5 as id,‘eee‘ as name ,1 as category_id
) b ON a.category_id = b.category_id
AND a.id >= b.id
where a.category_id = 1
GROUP BY
    a.category_id,
    a.id

原文地址:https://www.cnblogs.com/shgwater/p/10899054.html

时间: 2024-08-01 19:46:17

2019-05-21 SQL学习的相关文章

Oracle之PL/SQL学习笔记

自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家批评指正. PL/SQL定义:PL/SQL是由Oracle开发,专门用于Oracle的程序设计语言. PL---Procedural Language. SQL—Structure QueryLanguage.PL/SQL包括过程化语句和SQL语句     PL/SQL的单位:块. 一个块中可以嵌套

sql学习笔记(13)-----------sql函数总结

SQL AVG 函数 定义和用法 AVG 函数返回数值列的平均值.NULL 值不包括在计算中. SQL AVG() 语法 SELECT AVG(column_name) FROM table_name SQL AVG() 实例 我们拥有下面这个 "Orders" 表: O_Id OrderDate OrderPrice Customer 1 2008/12/29 1000 Bush 2 2008/11/23 1600 Carter 3 2008/10/05 700 Bush 4 200

SQL学习(时间,存储过程,触发器)

SQL学习 几个操作时间的函数 1 --datapart 获取时间中的年月日时分秒等部分 2 select DATEPART(year,current_timestamp); 3 select DATEPART(DAY,current_timestamp); 4 select DATEPART(MONTH,current_timestamp); 5 6 --dateadd 在相应时间上加上年月日时分秒等 7 select CURRENT_TIMESTAMP,DATEADD(DAY,10,CURR

2016年7月21日学习笔记

2016年7月21日学习笔记 Linux安装以后出现的文件目录的作用: 文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.SHELL脚本.二进制的可执行文件等,可用cat.less.more.vi.emacs来察看内容,用mv来改名. 目录文件:包括文件名.子目录名及其指针.它是LINUX储存文件名的唯一地方,可用ls列出目录文件. 连接文件:是指向同一索引节点的那些目录条目.用ls来查看是,连

SQL学习分享(二)

1.插入数据 insert into table(id,name) values("","")                                                            ---插入数据到table表中 如:INSERT INTO sms.Communication  ( RefType,RefId,Type,Message,CreateUserId,CreateDate ) values (1,118113,11,'Thi

Oracle之PL/SQL学习笔记之触发器

Oracle之PL/SQL学习笔记之触发器 触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行. 即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数.所以运行触发器就叫触发或点火(firing).ORACLE事件指的是对数据库的表进行的INSERT. UPDATE及D

SQL 学习日志01

查看一个数据库的所有表: Select TABLE_NAME FROM 数据库名称.INFORMATION_SCHEMA.TABLES Where TABLE_TYPE='BASE TABLE' (select * from 表名 where 条件) 查看一张表的表结构: sp_help table_name(表名)  获取的信息比较全 sp_columns table_name(表名) 创建数据库: use master go create database test01(数据库名) 删除数据

SQL 学习日志02

SQL数据类型 1.字符类型 char   --定长字符数据   如 char(12)  这字段就会占用12字节的空间,无论这个字段只填写了2个字节.一般在可确定这字段长度时选用,如sex字段(因只有男和女两项可选)就可用 char(2). varvhar   --可变长字符数据  如varchar(50) 这字段最大只能填写50字节,按实际填写的字节存储.一般在不确定这字段长度时使用,如 Smail字段(因邮箱的长度不确定) 就可用varchar(50). text    --用来存储大量非统

TERADATA SQL学习随笔&lt;一&gt;

最近在TERADATA环境学习SQL.在这里记录一下学习中查过的知识点,作为备案. 目录: 关于SQL学习及所用在线数据库 表联合 (join) SQL子查询 在select时创建新字段 (as, case when) 数据分组 (group by + 聚合函数count, sum, avg等) 利用over (partition by)进行数据分组并创建新字段 样本选择 1.关于SQL学习及所用在线数据库 之前有看过一些SQL学习的书.但如果从学习效率来说,跟着书学习SQL,不如直接看生产环境