【发布时间】:2016-09-15 20:21:56
【问题描述】:
我对正在构建的查询有疑问,我想在 SQL 语句中完成所有操作。
所以,我有一张这样的数据表:
+-----+-----+-----+-----+
| pid | did | src | val |
+-----+-----+-----+-----+
| 1 | 1 | lab | 0 |
| 1 | 1 | lab | 1 |
| 2 | 3 | pl | 1 |
| 1 | 1 | pl | 1 |
| 2 | 1 | med | 1 |
| 1 | 1 | med | 1 |
+-----+-----+-----+-----+
有一个 ID 列 (pid)、一个疾病列 (did)、一个源 (src) 列和一个值 (val) 列。疾病列还有一个我这样创建的标准化表:
+-----+-----------------+
| did | name |
+-----+-----------------+
| 1 | Lung Cancer |
| 2 | Alcoholism |
| 3 | Obesity |
| 4 | Diabetes |
| 5 | Viral Infection |
+-----+-----------------+
这里真正的诀窍是我需要执行一个查询,该查询会生成一个表,该表会生成一个新表,该表显示每个 pid (ID),以及疾病 (did) 的相关文本名称,这可能是一个 JOIN使用规范化表。
棘手的部分是,对于每个 ID,我需要计算 (3) 个可能的来源 (src) 中每个的出现次数,因此可能会出现 5-10 个 ID 为 1,并且每个这些将具有关联的 src:MED、LAB 或 PL。我需要对每条记录进行计数并显示在如下表中。
+-----+------------------------+--------------------------+----------------------+
| pid | Lung Cancer | Alcoholism | Obesity
+-----+------------------------+--------------------------+----------------------+
| 1 | Yes | Maybe | No |
| | (med: 2, lab: 1, pl:1) | (med: 0, lab: 1, pl:1) | (med:0, lab:0, pl:0) |
+-----+------------------------+--------------------------+----------------------+
因此,可能有 5-10 行 ID 为 1,并且对于每一行,将分配一个 src(源),它将是三个值之一(lab、pl、med),它们将有一个值 0 零或 1 1。
最后会有一个计数,基本上达到三个状态(是)他们有疾病,(每个来源都为 1 或以上),或两个为 0,但一个有 1 或更多(也许),或全零,(否)
我不确定所有这些都可以通过 SQL 语句完成......或者我可以使用 JOIN/UNION 或某种组合来构建一个新表并放置所有值,然后对其进行 json_encode(我正在使用PHP),然后使用 Angular 对 src 值进行排序并进行计算并显示“是”、“否”或“可能”的引导按钮
感谢大家的帮助!这是一个相当令人费解的 SQL 语句,至少我是这么认为的。
【问题讨论】:
-
哪个 RDBMS? mysql? sql服务器?甲骨文?你试过什么?您似乎更可能使用条件聚合来寻找枢轴情况。
-
为了让这一切都在 SQL 中工作,您可能需要为每个不同类型的 src 建立一个相关的子查询来获取它们的总数。这通常是将一行或多行放入结果中的多列的唯一方法。使用分组和求和将两个表连接起来然后将行转换为 php 中的列会更容易。
-
您可以通过 GROUP BY 实现大部分目标。数据的实际呈现可以使用 PHP 或 Angular 中的少量程序代码来处理,您可以使用对医疗数据表有效的 HTML 表。您将选择 *, SUM(val) as val FROM pidTable JOIN didTABLE ON didTable.did = pidTable.did GROUP BY pid, didTable.did, src
-
@gview -- 这毫无意义 HTML 与这个问题有什么关系?
-
@Hogan,我建议使用 HTML 呈现最终输出,而不是尝试在 SQL 中创建伪表。应该在 PHP 或 Angular 中完成演示文稿/html 输出。用户在问题中提到了这两种方法的使用——我没有建议它们。