#mysql
#mysql
Вопрос:
у меня есть таблица этого общего формата. он был сгенерирован с помощью поворота, поэтому количество столбцов не является фиксированным.
id c1 c2... total
10 0 2 1 1 0 4
9 0 1 0 1 0 2
8 1 2 0 0 0 3
7 0 0 0 1 0 1
6 0 1 0 1 1 3
5 1 0 0 1 2 4
4 0 1 1 0 0 2
3 0 3 0 1 1 5
2 2 2 2 0 0 6
1 1 0 1 0 0 2
что мне нужно, так это взять «общее количество» (последнее слева) и разделить каждый из столбцов {c1, c2, c3 ….} на их соответствующее общее количество … например, если строка 10, c2 = 2, то c2 / total = 2/4 = 0,5
просто чтобы подчеркнуть, количество столбцов. не исправлено. это примерная таблица.
возможно ли это сделать только через mysql или необходим внешний скрипт?
большое спасибо
ОТРЕДАКТИРУЙТЕ, ЧТОБЫ УТОЧНИТЬ:
мои исходные данные, предварительно развернутые, выглядят так:
2 2
8 1
2 2
1 5
3 1
9 1
5 3
4 1
1 2
10 5
6 4
4 5
5 2
10 3
5 4
3 1
6 1
6 3
3 4
3 1
5 4
7 3
2 5
10 1
9 3
где первый столбец — «id», второй — «c». как показано, его необходимо преобразовать в таблицу сортировки на случай непредвиденных обстоятельств. где каждый идентификатор имеет счетчик для каждого «c» {c1, c2, c3 …}
есть ли эффективный способ кодирования этих данных в формате @bobwienholt, упомянутом ниже? (я новичок в mysql, на самом деле я научил его себе сегодня для поворота. извиняюсь, если это тривиально).
Комментарии:
1. Не могли бы вы выполнить эту операцию перед поворотом?
2. я полагаю, что нет, потому что мне нужно заранее получить итоговые данные перекрестной таблицы? возможно, я ошибаюсь?
Ответ №1:
На вашем месте я бы структурировал свою таблицу следующим образом:
CREATE TABLE data ( row INT, col INT, value INT );
Тогда вы можете сделать это:
SELECT d.row, d.col, d.value/t.total
FROM (
SELECT row, SUM(value) as total
FROM data
GROUP BY row;
) t INNER JOIN data d
ON d.row = t.row
ORDER BY row, col;
Это будет работать для любого количества «строк» и «столбцов».
Комментарии:
1. спасибо, Боб @bobwienholt, но мне нужно разъяснение, если бы вы могли… см. РЕДАКТИРОВАНИЕ моего вопроса. большое спасибо.
Ответ №2:
Хорошо, на основе вашего редактирования… Я бы просто импортировал данные как есть. Итак, вы бы создали такую таблицу:
CREATE TABLE data ( id INT, c INT);
Затем вы можете импортировать свои данные, используя LOAD DATA INFILE. Вы должны проконсультироваться с документами MySQL, чтобы узнать, как это использовать.
Тогда вы получите все свои значения c1, c2 и т. Д. Следующим образом:
SELECT id, c, COUNT(1) as num
FROM data
GROUP BY id, c;
Это дало бы такие результаты, как (на основе ваших выборочных данных):
id c num
1 2 1
1 5 1
2 2 2
2 5 1
3 1 3
Итак, в основном для id 3, c1 = 3… для идентификатора 2 c2 = 2 и т. Д.
Ваш общий столбец будет:
SELECT id, SUM(num) as total
FROM (
SELECT id, c, COUNT(1) as num
FROM data
GROUP BY id, c
) x
GROUP BY id;
В этом случае вам не придется сводить свои данные.