sql怎么添加自定义列并且将此列的数据作为条件查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql怎么添加自定义列并且将此列的数据作为条件查询相关的知识,希望对你有一定的参考价值。
有一个Warning表,表里面有Time和Num列,Time里面的日期不一定是连贯的,并且Time的日期可以重复
现在我需要查询出一个表,第一列必须显示连贯的日期,比如1到30号,每天都有
第二列显示对应日期产生的Num的总和,对应日期没有数据则显示0
因为第一列是表里面原本没有的,现在必须强行列出来,请问SQL的语句怎么写?
不要简写,我新手看不懂,要能直接查询的,谢了
select Time as 日期 ,sum(Num) as 月份总和
from Warning
group by Time
order by Time asc
/*---- 不写asc结果是一样的,因为默认是asc 升序,从1,2,3号这样开始升序排序。如果倒序则 desc
特别说明:依据楼主的提问:Time里面的日期不一定是连贯的,
1: 利用 group by Time 分组----解释:我把日期列Time 进行分组 如,1月, 2月, 3月, 4月, 5月
也就是说不管1月份的数据出现几次都归为一组,所有2月的都归为一组。到这里聪明点的人就知道了,把归为一组的 Num列 相加就可以实现要求了。
2:利用求和函数 sum (Num)把分组好的列求出他们的和就行了,这里就是所有1月为一组的会自动相加 (其他组的不相加),所有2月归为一组的会自动相加。。。。。。
3:利用 order by Time asc 升序产生连贯1月,2月,3月,这样升序排序。
4:特别说明:这里如果Time 列 数据类型是 datatime 的值是精确到时分秒的话,必须截取字符串,得到年月日或者只得到月份,因为时分秒分组的话就非常多了,1月份的时分秒都参与分组会有很多的,到时候得到1月份的和就变成1月份1号8点8分06秒 这个时间的都分组再求和。
5:楼主的要求:对应日期没有数据则显示0,isnull(你的列,0) 这个函数来转换成为0 在求和。0的总和还是0。
所以最终写成
select Time as 月份 ,sum(isnull(Num,0)) as 月份总和
from Warning
group by Time
order by Time asc
6:这个要求——因为第一列是表里面原本没有的,现在必须强行列出来,说得不太明确啊。
alter table 表名 add 列名 类型和属性等 这语句是创建一个新的列。
----*/ 参考技术A 不要跟我说你连接的数据库还是以前的Access的
而不是你千辛万苦导好的sql server
参考技术B select a.TheDate,isnull(count(b.time),0) as times
(select 1 as TheDate
union
select 2 as TheDate
union
select 3 as TheDate
union
select 4 as TheDate
union
select 5 as TheDate
union
select 6 as TheDate
union
.
.
.
.
select 30 as TheDate
union
select 31 as TheDate) a left join tbl b on a.TheDate=day(b.time)
group by a.TheDate追问
看不大懂。。。为什么感觉连warning表都没用到。。。
参考技术C 你这个只能写存储过程 一两条sql是弄不出来的更好的条件列查询方法
--OldQuery
SELECT oldStartDate AS column,...
FROM Table
WHERE
oldStartDate > @date,...
GROUP BY
oldStartDate,...
在表中添加了一个新的列newStartDate
nullable,数据提取必须有条件地依赖于此列
--NewQuery
SELECT ISNULL(newStartDate, oldStartDate) AS column,...
FROM Table
WHERE
(
(newStartDate IS NULL AND oldStartDate > @date)
OR
(newStartDate > @date)
),...
GROUP BY
ISNULL(newStartDate, oldStartDate),...
以上是我可以想到的有条件检索的方法,但在我看来它会导致性能问题,我无法在DEV
环境中评估,因为数量不够大,但产量估计大约2mil记录。想知道是否有其他推荐的方法呢?
答案
如果你打算在ISNULL
条款中使用GROUP BY
,你也可以在WHERE
条款中使用,因为两者都会使newStartDate
无法解决,because the column is nullable.(感谢链接,John Cappelletti!)
假设NewStartDate
将替换OldStartDate
,您可以做的一件事是将newStartDate
中的所有空值更新为oldStartDate
的非空值,然后将您的newStartDate
列更改为不可为空的列:
UPDATE TableName
SET NewStartDate = OldStartDate
WHERE NewStartDate IS NULL;
GO
ALTER TABLE TableName
ALTER COLUMN NewStartDate date NOT NULL;
GO
然后您的查询可以更简单和更可靠:
SELECT NewStartDate AS column,...
FROM Table
WHERE
NewStartDate > @date,...
GROUP BY
NewStartDate ,...
以上是关于sql怎么添加自定义列并且将此列的数据作为条件查询的主要内容,如果未能解决你的问题,请参考以下文章