MS SQL - 用于检查group by中是否存在值的子查询

时间:2016-10-12 12:03:12

标签: sql-server

有没有办法构建这样的查询?

一个有10个值,表两个有100个值。

一个

id   | name   | value | weekStart  | weekEnd     | superValue
-----+--------+-------+------------+-------------+-----------
1    | tom    |  1    | 2016-01-01 | 2016-01-07  |    A
2    | tom    |  1    | 2016-08-01 | 2016-01-14  |    E
3    | mark   |  0    | 2016-01-01 | 2016-01-07  |    A

两个

id   | name   | age
-----+--------+----
1    | tom    | 16
2    | Xavier | 19
3    | mark   | 20
4    | bob    | 20
5    | alan   | 35

我根据他们的名字加入了他们(一个记录到多个记录),然后按名称对它们进行分组。

所以我们有一个这样的转发:

id   | name   | value | (min)weekStart | (max)weekEnd 
-----+--------+-------+----------------+-------------
1    | tom    |  1    | 2016-01-01     | 2016-01-14
2    | mark   |  0    | 2016-01-01     | 2016-01-07

如果此名称的任何值的值为“E”,那么有没有办法显示带有基于第一个表列(superValue)的值的其他列,然后是“是”否则“否”

id   | name   | value | (min)weekStart | (max)weekEnd | is it super ?
-----+--------+-------+----------------+--------------+---------------
1    | tom    |  1    | 2016-01-01     | 2016-01-14   |   Yes
2    | mark   |  0    | 2016-01-01     | 2016-01-07   |   No

2 个答案:

答案 0 :(得分:1)

我没有得到,你是如何处理one.value的,但这是我的解决方案: (所以你实际上不需要子查询。)

select
    `two`.`id`,
    `two`.`name`,
    max(`one`.`value`) as `value`,
    min(`one`.`weekStart`) as `minWeekStart`,
    max(`one`.`weekEnd`) as `maxWeekEnd`,
    sum(if(`one`.`superValue` = 'E', 1, 0)) > 0 as `is it super?`
from
    `two`
    inner join `one`
        on (`two`.`name` = `one`.`name`)
group by
    `two`.`name`
order by
    `two`.`id`;

如果您通过ID引用表two,而不是名称,则会更好。

编辑:解释它的工作原理:

sum(if(`one`.`superValue` = 'E', 1, 0)) > 0 as `is it super?`

" if" sum里面的语句返回1的值是' E'否则返回0。总和只是将这些0和1加在一起,最后我们检查总和是否大于0,这意味着:是否至少有一个' E' E' E'值。

答案 1 :(得分:0)

是的,这是可能的。只需使用selectcase添加其他列即可。如果在内部联接或表1的实际名称中给出,则将table-one替换为table-one的别名。

select <existing-columns>,Case when Max(table-one.superValue) = 'E' then 'yes' else 'no' end as [is-it-super]
from <existing-joins>