sql如何按天和类别分类汇总
表(表名TbName)结构:字段A(日期型),字段B(varchar型)。假如有二条记录:2014-01-1016:19:55'动漫'2014-01-1316:10:25...
表(表名TbName)结构:字段A(日期型),字段B(varchar型)。
假如有二条记录:
2014-01-10 16:19:55 '动漫'
2014-01-13 16:10:25 ‘科幻'
如何实现每天的数量(2014-1-11无记录则为0)
像:select convert(char(10),A,121) as curday,B,count(*) from TbName group by convert(char(10),A,121) ,sort
像这样当天无记录则不以实现。
上面SQL应为:select convert(char(10),A,121) as curday,B,count(*) from TbName group by convert(char(10),A,121) ,B 展开
假如有二条记录:
2014-01-10 16:19:55 '动漫'
2014-01-13 16:10:25 ‘科幻'
如何实现每天的数量(2014-1-11无记录则为0)
像:select convert(char(10),A,121) as curday,B,count(*) from TbName group by convert(char(10),A,121) ,sort
像这样当天无记录则不以实现。
上面SQL应为:select convert(char(10),A,121) as curday,B,count(*) from TbName group by convert(char(10),A,121) ,B 展开
3个回答
推荐于2018-04-24
展开全部
CREATE TABLE #TbName (
A DATETIME,
B varchar(10)
);
GO
INSERT INTO #TbName VALUES('2014-01-10 16:19:55', '动漫');
INSERT INTO #TbName VALUES('2014-01-13 16:10:25', '科幻');
GO
SELECT
convert(char(10), d.[EveryDay], 121) AS curday,
t.B,
count(t.B)
FROM
(SELECT
convert(char(10), DATEADD(dd, s.number, (SELECT MIN(t2.A) FROM #TbName t2)), 121) AS [EveryDay]
FROM
master..spt_values s
WHERE
s.type='P'
AND s.number >= 0
AND convert(char(10), DATEADD(dd, s.number, (SELECT MIN(t2.A) FROM #TbName t2)), 121) <= (SELECT convert(char(10), MAX(A), 121) FROM #TbName t3)
) d
LEFT JOIN #TbName t
ON ( convert(char(10), d.[EveryDay], 121) = convert(char(10), t.A, 121) )
GROUP BY
convert(char(10), d.[EveryDay], 121) ,
t.B
ORDER BY
curday, t.B
GO
curday B
---------- ---------- -----------
2014-01-10 动漫 1
2014-01-11 NULL 0
2014-01-12 NULL 0
2014-01-13 科幻 1
警告: 聚合或其他 SET 操作消除了 Null 值。
这样行么?
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
展开全部
select convert(varchar(10),a.rq,120),B,isnull(count(*),0)
(select
cast('2014-01-10' as datetime)+number-1 rq
from master..spt_values where type='P' and number between 1 and (select datediff(day,cast('2014-01-10' as datetime),cast('2014-01-13' as datetime)))+1) as a
left join TbName b on convert(varchar(10),a.rq,120)=convert(char(10),b.A,120)
group by convert(varchar(10),a.rq,120),B
这样试试
主要是你把这句弄懂了就行,用这个构造一个时间的虚拟列
select
cast('2014-01-10' as datetime)+number-1 rq
from master..spt_values where type='P' and number between 1 and (select datediff(day,cast('2014-01-10' as datetime),cast('2014-01-13' as datetime)))+1
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建议加个日期维表,如Tbdate表 可以只有一个字段就是全的日期
然后用原表 right join Tbdate
第一个字段用日期维表中的日期,
后面的count(*)改为nvl(count(*),0)
然后用原表 right join Tbdate
第一个字段用日期维表中的日期,
后面的count(*)改为nvl(count(*),0)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询