从多个列中计算一个特定值,并按另一列中的值进行分组...在mysql中

时间:2011-04-28 15:58:05

标签: mysql

嘿。当用户填写报表并提交报表时,我有160列填充数据。这些列中的一些列包含类似的数据,但每个记录集需要有多个此数据实例,因为报告中的每个实例可能不同。

例如,员工在当天的某个时间点以某种类型打开案例,然后在当天的另一个时间点打开另一个不同类型的案例。我想根据这些列中的值为每个用户创建总计。我想立即定位一个列集,案例类型。我希望能够在列CT1,CT2,CT3 ......到CT20中看到值“TSTO”的所有实例。然后按员工ID号排序,这只是表格中的一列。

有什么想法吗?我正在努力解决这个问题。

到目前为止,我有SELECT CT1, CT2, CT3, CT4, CT5, CT6, CT7, CT8, CT9, CT10, CT11, CT12, CT13, CT14, CT15, CT16, CT17, CT18, CT19, CT20 FROM REPORTS GROUP BY OFFICER

这将显示记录集中所有案例类型条目的值,但我需要计算它们,我试图使用,

SELECT CT1, CT2, CT3, CT4, CT5, CT6, CT7, CT8, CT9, CT10, CT11, CT12, CT13, CT14, CT15, CT16, CT17, CT18, CT19, CT20 FROM REPORTS COUNT(TSTO) GROUP BY OFFICER

但它只是吐出一个错误。我是相当新的mysql数据库和PHP,我觉得我有一个很好的把握,但查询数据库和所涉及的语法现在有点混淆和/或压倒性。只是要学习语言。我会继续寻找,我在这里发现了一些类似的东西,但我不明白我在看什么(完全),我想回避使用“有效”但我完全不了解的代码。 / p>

非常感谢:)

编辑 -

因此,此数据库是员工日常工作的活动报告服务器。该人经常在白天打开案件。这些案件的类型各不相同,它们的不同类型由四个字母的惯例指定。因此,您的不同案例类型可能是TSTO,DOME,ASBA等等。因此,用户将在一天内填写表单,然后将其提交到数据库。这一切都很好:)现在我正在尝试构建一个页面,它将通过用户请求查询数据库以获取用户活动的统计信息。所以现在我正在尝试生成统计数据。具体来说,我希望能够生成统计数据,并且在人类方面,“用户输入案例类型的发生次数多少”是为了EMPLOYEEIDXXX“

因此,当用户提交表单时,他们将以一种形式输入此四字母大小写类型最多20次,此案例类型条目有20个字段,因此有20列。因此,案例类型的这20列将在一个记录集中,每个报告生成一个记录集。生成的另一列是employeeid列,它基本上标识了谁通过其表单生成记录集。

所以我希望能够在所有记录集中查询所有20个案例类型的列,以查找已定义类型的案例(TSTO,DOME,ASBA等),然后将其分组到相应的用户

所以输出看起来像是,

316 TSTO用于employeeid108

我希望这有助于清除它。我对所有这些都相当新鲜,所以我不是最好的白话和最佳实践等...

非常感谢:)

编辑2 -

因此,为了进一步阐述我的目标,我有一个包含164个字段的HTML表单。这些字段中的每一个最终都会将值放入我的数据库中的每个提交的单个记录集中的列中。我无法发布图片或两个以上的网址,所以我会尝试在没有屏幕截图的情况下尽力解释。

所以会发生什么,这些信息会进入数据库。然后是查询。我有一个搜索页面,它使用HTML表单来选择要搜索的信息类型。然后,它会显示与查询匹配的每个报告的概要。用户只需将他们想要查看的报告的REPORT ID#输入另一个小表单(带有提交按钮的输入字段),这会将他们带到一个页面,并在他们点击提交时显示完整的报告。

所以现在我正在努力做总计并意识到我的数据库将需要一些工作和调整,以便更容易为所需的不同信息创建查询。到目前为止,我已经收集了一些很好的信息,并将继续尽力提供有关我的设置的简明信息。

感谢。

编辑3 -

也许你可以去我的photobucket并检查它们,应该让我做一个链接,有五个截图,你可以更好地看到我在那里发生的事情。

http://s1082.photobucket.com/albums/j376/hughessa

:)

1 个答案:

答案 0 :(得分:0)

您正在寻找的查询对于您当前的数据库架构来说将是非常漫长和复杂的。

每个表(some_id,column1,column2,column3,column4 ...),其中列存储相同类型的数据,也可以用表(some_id,column_number,column_value)表示,而不是1行,其值为20列你有20行。

所以你的桌子应该看起来像:

officer     ct_number     ct_value
1           CT1           TSTO
1           CT2           DOME
1           CT3           TSTO
1           CT4           ASBA
(...)
2           CT1           DOME
2           CT2           TSTO

对于这样的表,如果你想找到官员1中有多少个不同的ct_values,你会使用一个简单的查询:

SELECT officer, ct_value, count(ct_value) AS ct_count 
  FROM reports WHERE officer=1 GROUP BY ct_value

给出结果

officer   ct_value    ct_count   
1         TSTO        2
1         DOME        1
1         ASBA        1

如果您想知道有多少TSTO适用于您将使用的不同官员:

SELECT officer, ct_value, count( officer ) as ct_count FROM reports
  WHERE ct_value='TSTO' GROUP BY officer

给出结果

 officer  ct_value  ct_count
 1        TSTO      2
 2        TSTO      1

您的旧架构的任何类型的查询都可以轻松转换为新架构。

但是,如果您需要存储有关每个特定报告的其他信息,我建议您使用两个表:

Submissions 
submission_id    report_id   ct_number  ct_value
primary key      
auto-increment
------------------------------------------------
1                1           CT1        TSTO
2                1           CT2        DOME
3                1           CT3        TSTO
4                1           CT4        ASBA
5                2           CT1        DOME
6                2           CT2        TSTO  

report_id指向另一个表中的记录,其中列数与您需要的其他数据一样多:

Reports
report_id      officer     date                 some_other_data
primary key
auto-increment
--------------------------------------------------------------------
1              1           2011-04-29 11:28:15  Everything went ok
2              2           2011-04-29 14:01:00  There were troubles

实施例: 不同的官员有多少TSTO:

SELECT r.officer, s.ct_value, count( officer ) as ct_count 
FROM submissions s JOIN reports r ON s.report_id = r.report_id
WHERE s.ct_value='TSTO' 
GROUP BY r.officer