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
展开
 我来答
匿名用户
推荐于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 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
badkano
2014-01-13 · 知道合伙人体育行家
badkano
知道合伙人体育行家
采纳数:144776 获赞数:885371
团长

向TA提问 私信TA
展开全部
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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友61aa85e38
2014-01-13 · TA获得超过164个赞
知道小有建树答主
回答量:305
采纳率:0%
帮助的人:192万
展开全部
建议加个日期维表,如Tbdate表 可以只有一个字段就是全的日期
然后用原表 right join Tbdate
第一个字段用日期维表中的日期,
后面的count(*)改为nvl(count(*),0)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式