在GROUP BY中的做文章(一道题五中简答方法!)

被废话,直接上代码

测试代码,数据如下:

CREATE TABLE #T(
 TIMES VARCHAR(15),
 RESULT NVARCHAR(20)
)

INSERT  INTO #T
SELECT  ‘2005-05-09‘,‘胜‘
UNION ALL
SELECT ‘2005-05-09‘, ‘胜‘
UNION ALL
SELECT ‘2005-05-09‘, ‘负‘
UNION ALL
SELECT ‘2005-05-09‘, ‘负‘
UNION ALL
SELECT ‘2005-05-10‘, ‘胜‘
UNION ALL
SELECT ‘2005-05-10‘, ‘负‘
UNION ALL
SELECT ‘2005-05-10‘, ‘负‘

要求结果:

时间          胜  负
2005-05-09      2  2
2005-05-10      1  2

方法一:CASE 的妙用

--结果
--CASE 里面做文章滴呀;
--我艹尼玛;
--CASE 用户group by 之后的逻辑判断滴呀;--好逻辑,尼玛case的妙用滴呀;

SELECT TIMES,
 SUM(CASE WHEN RESULT=‘胜‘ THEN 1 ELSE 0 END) AS 胜,
 SUM(CASE WHEN RESULT=‘负‘ THEN 1 ELSE 0 END) AS 负
FROM #T
GROUP BY TIMES

方法二:共用表达式+COUNT()

GO
WITH A AS(
SELECT TIMES,COUNT(*) AS WIN FROM #T
WHERE RESULT=‘胜‘
GROUP BY TIMES
), B AS(
SELECT TIMES,COUNT(*) AS LOSE FROM #T
WHERE RESULT=‘负‘
GROUP BY TIMES)

SELECT AA.TIMES,AA.WIN,BB.LOSE FROM A AA INNER JOIN B BB
ON AA.TIMES=BB.TIMES

方法三:既然能够使用我们的共用表达式,那么自然能使用我们的临时表滴啦

方法四:

  SELECT A.TIMES,A.WIN,B.LOSE FROM
  (
   SELECT TIMES,COUNT(*) WIN FROM #T
   WHERE RESULT=‘胜‘
   GROUP BY TIMES
  ) AS A,

  (
   SELECT TIMES,COUNT(*) LOSE FROM #T
   WHERE RESULT=‘负‘
   GROUP BY TIMES

  ) AS B

  WHERE A.TIMES=B.TIMES

方法五:

 SELECT N.TIMES,N.WIN,M.LOSE FROM (
  (
    SELECT TIMES,COUNT(*) AS WIN FROM #T
    WHERE RESULT=‘胜‘
    GROUP BY TIMES)N
    INNER JOIN
    (SELECT TIMES ,COUNT(*) AS LOSE FROM #T
    WHERE RESULT=‘负‘
    GROUP BY TIMES
    )M ON N.TIMES=M.TIMES

  )

  --中间的赛选条件也可以这样写滴呀
  --我艹尼玛
  SELECT TIMES,COUNT(*) as win  FROM #T
  GROUP BY TIMES,RESULT
  HAVING RESULT=‘胜‘

帅~

时间: 2024-10-18 03:29:38

在GROUP BY中的做文章(一道题五中简答方法!)的相关文章

SQL GROUP BY 中的TOP N

一个示例表test(select * from test): id gid    age    username1 1      11     zhangsan2 1      13     zhangsan3 1      15     lisi4 1      10     wangwu5 2      20     liusanjie6 2      23     wumingshi7 1      10     hh 按gid分组取每组第一个数据的SQL: SELECT * FROM t

oracle group by中cube和rollup字句的使用方法及区别

oracle group by中rollup和cube的区别:  Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句. 如果是ROLLUP(A, B, C)的话,先会对(A.B.C)进行GROUP BY,然后对(A.B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作: 如果是GROUP BY CUBE(A, B, C),则首先会对(A.B.C)进行GROUP BY,然后依次是(A.B),(A.C),(A),(B.C)

Java使用正则表达式取网页中的一段内容(以取Js方法为例)

关于正则表达式: 表1.常用的元字符 代码 说明 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配字符串的开始 $ 匹配字符串的结束 表2.常用的限定符 代码/语法 说明 * 重复零次或更多次 + 重复一次或更多次 ? 重复零次或一次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次 表3.常用的反义代码 代码/语法 说明 \W 匹配任意不是字母,数字,下划线,汉字的字符 \S

ArgumentException: Getting control x's position in a group with only x controls when doing KeyDown Aborting解决方法

标题有点长,做Editor工具时遇到的问题.最后解决了,总结下 有可能你在界面中用了键盘事件或者其他事件,导致这个报错.官方论坛有个解释比较给力LINK 我在渲染Layout和Repaint的时候加上这个判断: if (Event.current.type == EventType.KeyDown || Event.current.type == EventType.KeyUp) return; 并且保证其他事件类型不会出现在Layout和Repaint中,最后不再报错. ArgumentExc

Python统计列表中的重复项出现的次数的方法

前言 在实际工作和学习中,经常会遇到很多重复的数据,但是我们又必须进行统计,所及这里简单介绍一下统计列表中重复项的出现次数的简单方法. 实例 本文实例展示了Python统计列表中的重复项出现的次数的方法,是一个很实用的功能,适合Python初学者学习借鉴.具体方法如下: #方法1: mylist = [1,2,2,2,2,3,3,3,4,4,4,4] myset = set(mylist)  #myset是另外一个列表,里面的内容是mylist里面的无重复 项 for item in myset

javascript中利用柯里化函数实现bind方法

柯理化函数思想:一个js预先处理的思想:利用函数执行可以形成一个不销毁的作用域的原理,把需要预先处理的内容都储存在这个不销毁的作用域中,并且返回一个小函数,以后我们执行的都是小函数,在小函数中把之前预先存储的值进行相关的操作处理即可: 柯里化函数主要起到预处理的作用: bind方法的作用:把传递进来的callback回调方法中的this预先处理为上下文context; /** * bind方法实现原理1 * @param callback [Function] 回调函数 * @param con

unity中三种调用其他脚本函数的方法

第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名().很不实用-- 第二种,GameObject.Find("脚本所在物体名").SendMessage("函数名");  此种方法可以调用public和private类型函数 第三种,GameObject.Find("脚本所在物体名").GetComponent<脚本名>().函数名();此种方法只可以调用public类型函数 unity中三种调用其他脚本函数的

PHP中获取文件扩展名的N种方法

PHP中获取文件扩展名的N种方法 从网上收罗的,基本上就以下这几种方式: 第1种方法: function get_extension($file) { substr(strrchr($file, '.'), 1); } 第2种方法: function get_extension($file) { return substr($file, strrpos($file, '.')+1); } 第3种方法: function get_extension($file) { return end(expl

在C++工程中main函数之前跑代码的廉价方法(使用全局变量和全局函数)

[cpp] view plain copy // test.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <windows.h> #include <crtdbg.h> /// 在C++工程中main函数之前跑代码的廉价方法 /// 利用全局变量可以赋可变初值的事实 /// mainCRTStartup() => _cin