【发布时间】:2016-12-02 20:59:58
【问题描述】:
为含糊的标题道歉,但这更像是在寻求建议而不是寻找直接答案。作为参考,我使用的是 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 表示参加该会话的人员。该表超过 60 万行。
我的问题是在尝试查询特定日期范围之间的数据时出现的,例如,我想在日期标识 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 行(这是您想要的) - 这是一个示例:stackoverflow.com/questions/40866952/…。您可以使用 ten
union all,但通常它们很难让查询规划器优化。 -
虽然工作量很大,但如果数据库设计一直这么“笨拙”,而且你必须做很多报告,你可以建立一个数据仓库
-
我认为第二种设计也有缺陷,因为它确实无法代表工作日。由于没有其他标准可供排序,因此无法判断第二个表中的行指的是哪一天。
-
感谢您的 cmets,尼克。这一点我已经记在心里了,以后一定会作为类似情况的参考!
标签: sql sql-server tsql