分类统计的SQL,你可能没有用过

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/geyunfei_hit/article/details/1906499

在企业开发中,经常要用到报表统计等功能,对于大多数程序员来说,所能想到的可能只是将数据按不同的条件取出,分批统计,而实际上,用sql自代的特性便能达到这种要求,这种即case 语句

按照SQL Server 联机文档,case语法有两种,格式如下:

简单 CASE 函数:

CASE input_expression
    WHEN when_expression THEN result_expression
        [ ...n ]
    [
        ELSE else_result_expression

    END

CASE 搜索函数:

CASE
    WHEN Boolean_expression THEN result_expression
        [ ...n ]
    [
        ELSE else_result_expression

    END

这两种方式其实大同小宜,无非就是条件式即可以是值也可以是表达式.

下面看一下实例吧,呵呵

例一:

设某张进出人数统计表有name(姓名),recordDate(进出时间),state(0为进,1为出)这几列组成,那么

如果分批显示一天的进出人数,可以如下进行:

select sum(case when state = 0 then 1 else 0 end),

sum(case when state = 1 then 1 else end) from recordtable

where datediff([day],getdate(),recordDate) = 0;
 

而且注意,when后的可以是值,也可以是表达式,因此,又有如下应用:

例2:设表结构如上,只不过name改成了重量(这都什么含义啊,呵呵)那么,如果要统计进出重量,就可以如下:

select sum(case when state = 0 then weight else 0 end),

sum(case when state = 1 then weight else end) from recordtable

where datediff([day],getdate(),recordDate) = 0;

还有,你可以在数据处理时直接完成要在界面上显示的工作,比如,你如果将例1中的表在界面上显示,那么state肯定不会显示为0或1,因为用户不会明白0,1的含义,正常的思路可能是先生成dataset,再逐条处理,而这时,可以用case表达式提前处理数据,如下:

select name,recordtdate,case when sate = 0 then '进入' else '出入' end.

嘿嘿,这是我能想到的case的几种用法,如好的建议,还希望各们看官能留言,拍砖
 

展开阅读全文

一个分类统计sql问题。

08-28

表InterceptInforn[code=sql]rnID SiteID KeywordName Icookie IP InterceptDateTime InterceptTypeIDrn2129 14 testttttt 4956d2b444923e488333c56202f459 127.0.0.5 2015-04-17 14:41:25.297 1rn2130 16 testttttt 4956d2b444923e488333c56202f444 127.0.0.1 2015-04-17 14:42:25.297 1rn2131 14 testttttt 4956d2b444923e488333c56202f459 127.0.0.2 2015-04-20 14:43:25.297 2rn2132 16 testttttts 4956d2b444923e488333c56202f459 127.0.0.1 2015-04-17 14:44:25.297 1rn2133 16 testttttt 4956d2b444923e488333c56202f459 127.0.0.5 2015-04-16 14:45:25.297 4rn2134 14 testtttttv 4956d2b444923e488333c56202f459 127.0.0.1 2015-04-21 14:46:25.297 1rn2135 16 testttttt 4956d2b444923e488333c56202f459 127.0.0.3 2015-04-16 14:47:25.297 3rn2136 18 testtttttl 4956d2b444923e488333c56202f459 127.0.0.1 2015-04-17 14:48:25.297 1rn2137 16 testttttt 4956d2b444923e488333c56202f459 127.0.0.5 2015-04-16 14:49:25.297 3rn2138 17 testtttttd 4956d2b444923e488333c56202f459 127.0.0.1 2015-04-17 14:50:25.297 3rn2139 18 testttttt 4956d2b444923e488333c56202f422 127.0.0.1 2015-04-25 14:14:25.297 3rn2140 16 testttttt 4956d2b444923e488333c56202f459 127.0.0.9 2015-04-20 14:24:25.297 1rn2141 16 testtttttk 4956d2b444923e488333c56202f443 127.0.0.1 2015-04-11 14:34:25.297 1rn2142 14 testttttt 4956d2b444923e488333c56202f498 127.0.0.6 2015-04-20 14:54:25.297 2rn2143 14 testttttt 4956d2b444923e488333c56202f459 127.0.0.5 2015-04-17 11:41:25.297 1rn2144 14 testttttt 4956d2b444923e488333c56202f459 127.0.0.5 2015-04-17 12:41:25.297 1rn2145 14 搜索竞价 6cc67a8447aa22c60b52b733184d38 10.110.0.46 2015-08-05 10:23:25.523 1rn2146 14 未识别字符 fff25c48180b2462484d67c08c8a3f 127.0.0.1 2015-08-25 16:35:27.770 3rn2147 14 未识别字符 536c2f8a7dbf692b311fc274ed1f98 127.0.0.1 2015-08-25 16:41:23.157 2rn2148 14 未识别字符 536c2f8a7dbf692b311fc274ed1f98 127.0.0.1 2015-08-25 17:06:24.197 1rn2149 14 未识别字符 536c2f8a7dbf692b311fc274ed1f98 127.0.0.1 2015-08-25 17:09:59.657 3rn2150 14 未识别字符 d3c39f61899a92ac06cb72ff96a2a6 127.0.0.1 2015-08-25 18:04:39.277 3rn2151 14 未识别字符 d3c39f61899a92ac06cb72ff96a2a6 127.0.0.1 2015-08-25 18:06:14.977 3rn2152 14 aaaaa 6cc67a8447aa22c60b52b733184d38 10.110.0.46 2015-08-26 10:23:25.523 1rn[/code]rn表InterceptTypern[code=sql]rnTypeID TypeNamern1 善意提醒rn2 发起攻击rn3 给予警告rn4 直接加入黑名单rn5 直接添加到vvvv排除 rn6 直接加入黑名单2rn[/code]rnrn想达到效果(按时间分组并按类型统计其个数并按时间倒序)rn[code=sql]rnINTERCEPTDATETIME 善意提醒 发起攻击 给予警告 直接加入黑名单 直接添加到vvvv排除 直接加入黑名单2rn2015-08-26 1 0 0 0 0 0rn2015-08-25 1 0 3 0 0 0rn2015-08-05 1 0 0 0 0 0rn[/code] 论坛

没有更多推荐了,返回首页