2015-10-26 3 views
1

Рассмотрим сценарий:SQL объединения счета с другими полями

id name info done 
----------------------- 
1  abc x  0 
2  abc y  1 <-- I have this id 
3  pqr g  1 
4  pqr h  0 
5  pqr i  1 <-- I have this id 

У меня есть идентификатор для последней записи каждого имени.

В результате я ожидаю, состоит из 2-х вещей:

  1. Информация для последней записи имени

  2. числа проделанной [имеющего значение 1] для этого имени

(1) может быть легко достигнуто select info from table where id = myid

Но как может (2) быть достигнуто в том же запросе? Можно ли это сделать в том же запросе?

Что-то вроде

select info, count(done) from table where id = myid group by name where ...... 

ответ

2

Это немного сложнее, но может быть сделано с помощью условная агрегация:

select max(case when t.id = myid then info end), sum(done) 
from table t 
where t.name = (select name from table t2 where t2.id = myid); 

Ключ получает все строки для данного имени.

Если у вас несколько столбцов, то коррелированный подзапрос может быть путь:

select t.*, 
     (select sum(t2.done) from table t2 where t2.name = t.name) as numdone 
from table t 
where t.id = myid; 
+0

@ Ответ Хемарио (как я вижу сейчас) неверен, потому что вычисление 'done' неверно. –

+0

@ GordonLinoff вы можете сказать, почему вы думаете, что это неправильно? – Hemario

2

Учитывая сделано либо 1 или 0 Вы могли бы только получить сумму и показать, что.

select info, sum(done) 
from table where id = mid 
group by info 

EDIT:

select info, s 
from table 
inner join (
    select name, sum(done) as s 
    from table 
    group by name  
) as zzz on zzz.name = table.name 
where id = myid 
+1

Как это даст OP номер «Готово» для всех записей, имеющих одно и то же имя «myid»? – JNevill

+0

@JNevill, вы правы. Изменил мой ответ – Hemario

1

Если вы хотите, чтобы отобразить более подробные данные, используйте оконную функцию:

select info, count(done) over (partition by name) ... 
2

Вы можете присоединиться к таблице обратно к себе на name, чтобы получить это.

SELECT t1.myid, t1.info, sum(t2.done) as number_of_done 
FROM table t1 INNER JOIN table t2 on t1.name = t2.name 
WHERE t1.id = myid 
GROUP BY t1.myid, t1.info 
+0

будет группироваться по t1.myid? поскольку id уникальны. – user5155835

+0

Да, поскольку мы объединяем 'SUM (t2.done)', когда вы присоединяете таблицу к себе по имени, вы, по сути, продуваете количество записей на 't1' числом совпадающие имена на 't2'. Таким образом, мы должны 'sum' и' group by' возвращать его в одну запись с правильными цифрами 'done' с' t2' – JNevill

+0

, можете ли вы рассказать, лучше ли ваше решение или Hemario с точки зрения эффективности? – user5155835

Смежные вопросы