我正在使用VB.net编写MYSQL应用程序,我需要添加的一项功能是能够为员工每周添加一列。例如,我想要将第一列称为“W1”,将下一列称为“W2”,依此类推,直到“W52”。所以我的问题是如何在我的表中添加一个列并将其名称添加到当前值的1?如果名字中没有任何字母,那将很容易,但我需要在标题中加上“W”以避免混淆。添加我有这个列:
ALTER TABLE manager ADD W1 MEDIUMINT;
如果可能,我只需要将一个INTEGER添加到VARCHAR数据类型的部分......也许应该涉及某种数据类型转换?
更新 我希望在我的vb.net表单中显示的是一个数据网格视图,看起来完全像这样:
进一步解释一下,最顶部的黑条是每周的日期标记,如果可能,我希望将其包含在datagridview中,但这不是必需的。在每周的专栏下,员工将输入他们工作的百分比(例如:20%,或0.20是工作的一天)我知道这是一种奇怪的做事方式,但它是强制性的......我想知道它是否是可以自动创建这些列,而不是我必须手动输入它们。
答案 0 :(得分:1)
1种可能的解决方案是创建2个新表
tbl_week: weekid,weekno,start_date,end_date
tbl_weeks_worked: userid,weekid,工作
并在数据库中转动数据。 (或者你可以在VB.NET中这样做)
如果您需要标题,则需要联合2个透视查询
例如:
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;
注意:(这只适用于单年视图)