Как добавить столбец с автоматически увеличивающимся именем в таблицу MySql?

Я использую VB.net для написания приложения MYSQL, и одна функция, которую мне нужно добавить, - это возможность добавлять столбец для каждой недели, в которой работали мои сотрудники. Например, я хочу, чтобы первый столбец назывался «W1», а следующий - «W2» и так далее, вплоть до «W52». Итак, мой вопрос: как добавить столбец в свою таблицу и добавить к его имени 1 к его текущему значению? Если бы в названии не было букв, это было бы легко, но мне нужно, чтобы в названии была буква «W», чтобы избежать путаницы. чтобы добавить столбец, у меня есть это:

ALTER TABLE manager ADD W1 MEDIUMINT;

мне просто нужна часть, которая добавляет INTEGER к типу данных VARCHAR, если это возможно ... Может быть, должно быть какое-то преобразование типа данных?

ОБНОВЛЕНИЕ: то, что я хочу отобразить в моей форме vb.net, - это представление таблицы данных, которое выглядит примерно так:

Образец из моей электронной таблицы

Чтобы объяснить дальше, черная полоса в самом верху - это отметки даты для каждой недели, я бы хотел, чтобы это было включено в datagridview, если это возможно, но это не требуется. В столбце каждой недели сотрудники будут вводить проценты, которые они проработали (пример: 20% или 0,20 - один рабочий день). Я знаю, что это странный способ делать что-то, но он обязательный ... и мне было интересно, было ли это можно автоматизировать создание этих столбцов, вместо того, чтобы вводить их вручную.


person daniel11    schedule 08.09.2011    source источник
comment
Как правило, когда у вас возникают подобные ситуации, вы сильно ошибаетесь в дизайне своей базы данных. Рассмотрите возможность использования отдельного стола на несколько недель.   -  person rickythefox    schedule 08.09.2011
comment
Я не отвечаю на ваш вопрос, но думаю, вам лучше создать новую таблицу (userid INT, week SMALLINT, data_you_need) и добавлять туда данные для каждого пользователя в неделю, а не в столбцы исходной таблицы !!!   -  person Marco    schedule 08.09.2011
comment
как создание новой таблицы что-нибудь решит? Я просто пытаюсь добавить столбцы, используя операторы, не связанные с запросом, вместо того, чтобы самому добавлять 52 столбца. извини, я должен был быть более ясным. Я хочу своего рода рекурсивную проверку и добавить оператор, чтобы узнать, существует ли W1, если нет, добавьте его, если он есть, перейдите к следующему оператору.   -  person daniel11    schedule 08.09.2011
comment
@daniel: Зачем нужна колонка на каждую неделю? Я бы просто создал таблицу WorkingTime с fiEmployee как FK и startTime и _4 _ (_ 5_ как поля. Остальное - SQL (например, чтобы получить номер недели из даты и времени).   -  person Tim Schmelter    schedule 08.09.2011
comment
@ Тим Шмельтер: Потому что я пытаюсь сделать элементы управления сеткой данных в моей программе как можно более похожими на мою электронную таблицу, поскольку я уже очень хорошо с ней знаком.   -  person daniel11    schedule 08.09.2011
comment
однако мне будет интересно увидеть пример вашего предложения (или, по крайней мере, предварительный просмотр окончательного результата)   -  person daniel11    schedule 08.09.2011
comment
База данных - это не электронная таблица. Прочтите, пожалуйста, о нормализации.   -  person Mchl    schedule 08.09.2011
comment
Я хорошо знаю разницу, все, что я делаю, - это создаю программу для отображения информации из моей базы данных (которая поступила из моей электронной таблицы) и позволяла другим сотрудникам и менеджерам добавлять или удалять что-то в ней.   -  person daniel11    schedule 09.09.2011
comment
Изначально я использовал электронную таблицу .xls и должен был отправить ее всем менеджерам проектов по электронной почте с внесенными изменениями, но это становилось такой болью.   -  person daniel11    schedule 09.09.2011


Ответы (1)


Одно из возможных решений - создать 2 новые таблицы

tbl_week: weekid, weekno, start_date, end_date

tbl_weeks_worked: ID пользователя, weekid, работал

и сворачиваем данные в базе данных. (в качестве альтернативы вы можете сделать это в VB.NET)

если вам нужен заголовок, вам нужно будет объединить 2 сводных запроса

e.g:

SELECT '' as userid,
      MAX(CASE WHEN w.weekno = 1 THEN w.start_date END)) AS 'W1', 
      MAX(CASE WHEN w.weekno = 2 THEN w.start_date END)) AS 'W2', 
      MAX(CASE WHEN w.weekno = 3 THEN w.start_date END)) AS 'W3', 
      ........ etc 
FROM tbl_week w
WHERE w.start_date >= start AND w.end_date <= enddate 

UNION ALL

SELECT  
  userid,  
  SUM(CASE WHEN w.weekno = 1 AND ww.weekid IS NOT NULL THEN worked ELSE 0 END)) AS 'W1', 
  SUM(CASE WHEN w.weekno = 2 AND ww.weekid IS NOT NULL THEN worked ELSE 0 END)) AS 'W2', 
  SUM(CASE WHEN w.weekno = 3 AND ww.weekid IS NOT NULL THEN worked ELSE 0 END)) AS 'W3', 
  ........ etc 
FROM tbl_week w
LEFT JOIN tbl_weeks_worked ww ON ww.weekid = w.weekid
WHERE w.start_date >= start AND w.end_date <= enddate 
GROUP BY userid; 

Примечание: (это будет работать только для просмотра одного года)

person Kevin Burton    schedule 08.09.2011
comment
хорошо, вам просто нужно добавить столбец для хранения отработанной части дня, отредактировали ответ - person Kevin Burton; 08.09.2011
comment
дайте мне знать, что они, и я могу вам помочь - person Kevin Burton; 24.09.2011
comment
он не указывает, он просто говорит, что у вас есть синтаксическая ошибка SQL в одном или нескольких или ваших операторах, пожалуйста, обратитесь к руководству пользователя MySql для получения дополнительной информации - person daniel11; 24.09.2011