mysql, разделяющий все столбцы на значения из одного столбца (для векторного вычисления и т.д.)

#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;
  

В этом случае вам не придется сводить свои данные.