2014-10-29 1 views
0

у меня есть структура таблицы, как этоткак дать пространство пути присоединения 2 колонки, повторив данные

CREATE TABLE `test` (
    `id` int(11) NOT NULL, 
    `userid` int(11) DEFAULT NULL, 
    `loan` int(11) DEFAULT NULL, 
    `name` varchar(90) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 


+----+--------+------+--------+ 
| id | userid | loan | name | 
+----+--------+------+--------+ 
| 1 |  1 | 100 | x | 
| 2 |  1 | 200 | X| 
| 3 |  2 | 2000 | y| 
| 4 |  3 | 1000 | z| 
| 5 |  1 | 500 | a| 
| 6 |  2 | 700 | b| 

Как вы можете видеть идент repeating.For пример 1 Идентификатор_пользователь является имеющим кредитом 100,200 и 500

Мое требование состоит в том, чтобы получить идентификатор пользователя, кредит и имя, и если идентификатор пользователя будет возвращен, тогда ссуда будет суммой повторяющегося идентификатора пользователя, а имя должно содержать пробел , например, В приведенной выше таблице userid 1 повторяется, так что сумма равна (100 + 200 + 500 = 800) аналогично для userid 2 сумма 2700 Выход, который я хочу, должен быть как е ниже

+--------+-----------+----+ 
| userid | SUM(loan) |name| 
+--------+-----------+----+ 
|  1 |  800 | | 
|  2 |  2700 | | 
|  3 |  1000 |z | 
+--------+-----------+ 

я могу сделать с ID_пользователем и кредитом, но я не знаю, как поставить пробел в поле имени, если идентификатор повторяет

Я пытался как этого

SELECT userid,SUM(loan) FROM 
testforsum 
GROUP BY userid 

а Ouput я получаю как этот

+--------+-----------+ 
| userid | SUM(loan) | 
+--------+-----------+ 
|  1 |  800 | 
|  2 |  2700 | 
|  3 |  1000 | 
+--------+-----------+ 

Я попытался создать sqlfiddle для него, но я не знаю, почему Inse rtion не happening.You можете увидеть таблицу here

+0

Итак, вы хотите отобразить пробел в поле имени, если у них более одного кредита, и фактическое имя, если у них есть только один? – Siyual

+0

@Siyual да точно – rocking

ответ

1
select q.userid, q.s, 
     case when q.n > 1 then ' ' else q.name end 
from 
(SELECT userid, SUM(loan) s, count(loan) n, max(name) name 
FROM testforsum GROUP BY userid) q; 

Некоторые пояснения:

(...) q является подзапрос, который вычисляет для каждого USERID суммы кредитов (NULLS игнорируются), количество кредитов (NULLS игнорируются).

max(name) это «подделка» агрегатная функция, я использовал его, чтобы получить любое имя для каждого USERID (все они одинаковы для каждого USERID, так что я могу сделать это), так как в ANSI SQL этот запрос является неправильным:

SELECT userid, IF(COUNT(*) > 1, ' ', name) AS name, SUM(loan) 
FROM testforsum GROUP BY userid; 

так как все выражения в списке SELECT должны быть либо агрегатными функциями (для нескольких строк возвращать одно значение), либо выражениями из предложения GROUP BY. Насколько я знаю, MySQL позволяет вам нарушать эти правила, но я предпочитаю следовать ANSI всякий раз, когда это возможно.

Таким образом, подзаголовок q приводит к таблице с уникальными идентификаторами пользователя с их именами + сумма и количество их кредитов.

И наконец, родительский запрос фильтрует результат в подзапросе q с использованием CASE.

+0

В подзапросе нет необходимости. Просто делайте 'CASE' непосредственно на' COUNT'. –

+0

@Patrick Q Спасибо за информацию. Я использовал подзапрос, чтобы сделать его более ясным. – Multisync

+1

@rocking. Если честно, мой ответ пришел первым. – Multisync

2
SELECT userid, IF(COUNT(*) > 1, ' ', name) AS name, SUM(loan) 
FROM testforsum GROUP BY userid; 
+0

Спасибо за ответ, + 1.I не мог понять эту часть * IF (COUNT (*)> 1, '', name) AS name *. Было бы неплохо, если вы объясните это в своем ответе – rocking

+0

@rocking, как сказано в Multisync, это функция MySQL, см. Документы здесь: http://dev.mysql.com/doc/refman/5.7 /en/control-flow-functions.html#function_if –

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