道歉的模糊标题,但这是更多的征求建议,而不是寻找直接的答案。作为参考,我正在使用SSMS 2014.查询尴尬存储的数据
我正在处理一个我没有创建的数据库,并且我正努力使用当前格式的数据。我列出了下表中的一个例子。
+-----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|DtID | ID | Mo1 | Mo2 | Tu1 | Tu2 | We1 | We2 | Th1 | Th2 | Fr1 | Fr2 |
+-----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 565 | 12 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 |
| 565 | 13 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
| 565 | 14 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 |
| 565 | 15 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 |
| 572 | 12 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 572 | 13 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
| 572 | 14 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
| 572 | 15 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
+-----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
DTID一个星期开始日期标识符,ID是一个人标识,MO1代表周一上午,MO2周一下午,等1意味着人出席了会议。该表超过600k行。
我试图查询特定日期范围之间的数据时发生问题,例如说我想在日期标识566和575之间找到目前出席标记的总和。日期566将引用星期二开始565,并且575将指星期四开始572.
我会更舒适的表格格式在下面的表格(以第1行为例)。
+-----+----+------+---------+
|DtID | ID | AMPM | Present |
+-----+----+------+---------+
| 565 | 12 | 1 | 0 |
| 565 | 12 | 2 | 1 |
| 566 | 12 | 1 | 0 |
| 566 | 12 | 2 | 1 |
| 567 | 12 | 1 | 1 |
| 567 | 12 | 2 | 0 |
| 568 | 12 | 1 | 0 |
| 568 | 12 | 2 | 0 |
| 569 | 12 | 1 | 1 |
| 569 | 12 | 2 | 0 |
+-----+----+------+---------+
这可能吗?有没有一种有效的方式来查询数据?我对SQL很陌生,到目前为止,我几乎所有的学习都来自于解释本网站上的问题和解答。正如我所说,我并不真正了解我所寻找的答案,因此,这里的用户的集体建议和智慧对我来说非常有用。
非常感谢。
你说得对。第二种表示比第一种更有意义。我会争辩说,现有的桌子设计是有缺陷的,但是我们必须与我们所得到的一起工作。有许多方法可以以所需的形式获得它。你可以交叉连接到另一个表将1行变成10(这是你想要的) - 这里是一个例子:http://stackoverflow.com/questions/40866952/merge-start-and-end-columns-to-one -column/40867201#40867201。您可以全部使用10个“联合”,但查询规划人员通常难以对其进行优化。 –
尽管做了很多工作,但如果数据库设计始终如此“尴尬”,并且您必须进行大量报告,则可以构建数据仓库 –
我认为第二个设计也有缺陷,因为它使得真的没有工作日的代表。由于没有其他标准可以进行排序,所以不可能确定第二个表格中的哪一天指的是哪一天。 –