需要sql或者存储过程根据flag获取数据吗?
Posted
技术标签:
【中文标题】需要sql或者存储过程根据flag获取数据吗?【英文标题】:Need sql or stored procedure to get data according to flag? 【发布时间】:2019-03-22 22:05:35 【问题描述】:Ex- 我有如下表 Name_Type -
+--------------+----------+
| Name_Type_Id | Code |
+--------------+----------+
| 1 | AN |
| 2 | BN |
| 3 | CN |
| 4 | DN |
| 5 | EN |
| 6 | FN |
+--------------+----------+
第二个表Table_A如下-
+-------+---------+--------------+------------------+
| T_ID | T_Value | Name_Type_Id | Name_Type_Value |
+-------+---------+--------------+------------------+
| T1 | A | 1 | 1 |
| T1 | B | 3 | 0 |
| T2 | A | 2 | 1 |
| T2 | B | 5 | 1 |
| T2 | C | 6 | 1 |
| T3 | A | 1 | 0 |
| T3 | B | 6 | 1 |
| T4 | A | 1 | 0 |
| T5 | A | 2 | 1 |
+-------+---------+--------------+------------------+
需要如下结果集-
+-------+---------+------+------+-------+-----+
| T_ID | T_Value | AN | BN | EN | FN |
+-------+---------+------+------+-------+-----+
| T1 | A | 1 | 0 | 0 | 0 |
| T1 | B | 0 | 0 | 0 | 0 |
| T2 | A | 0 | 1 | 0 | 0 |
| T2 | B | 0 | 0 | 1 | 0 |
| T2 | C | 0 | 0 | 0 | 1 |
| T3 | A | 0 | 0 | 0 | 0 |
| T3 | B | 0 | 0 | 0 | 1 |
| T4 | A | 0 | 0 | 0 | 0 |
| T5 | A | 0 | 1 | 0 | 0 |
+-------+---------+------+------+-------+-----+
描述- 在第二个表 Table_A T_ID & T_Value 中是唯一的。 我需要 name_type_code 作为列名,结果只有 table_A 中存在值“1”。 前任。与 name_type_code "DN" 一样,任何 T_ID 都没有值 CN 也一样,因为我们的值是“0”,所以我们不想要。
【问题讨论】:
我无法根据两个输入表弄清楚您最终是如何得到该输出的。你能解释一下这些代码(6 个代码中只有 4 个)是如何作为列名的吗? 为什么会有重复的行,难道不是像这样旋转数据以将所有内容收集在一行中吗? @JoakimDanielson 我们还有其他列和值也是独一无二的,例如 T1 我们有两个值 A 和 B,我没有在这里添加。 @TimBiegeleisen 我需要不同的 name_type_code 作为列名,结果只有在 table_A 中存在值“1”。前任。就像 name_type_code "DN" 一样,任何 T_ID 都没有值 "CN" 一样,就像我们有值 "0" 所以我们不想要。 删除这个问题,然后重新发帖,一定要清楚地解释你的逻辑。解释 SQL 查询的最佳方式是显示最少的输入和预期的输出。您不一定需要如此复杂的查询/数据集来获得解决问题的帮助。 【参考方案1】:您可能更喜欢将decode
用作:
select a.t_id, a.T_Value,
decode(n.code,'AN',a.value,0) as "AN",
decode(n.code,'BN',a.value,0) as "BN",
decode(n.code,'EN',a.value,0) as "EN",
decode(n.code,'FN',a.value,0) as "FN"
from Table_A a
left join Name_Type n
on ( n.name_type_id = a.name_type_id )
group by a.t_id, a.T_Value, a.value, n.code
order by a.t_id, a.T_Value;
T_ID T_VALUE AN BN EN FN
T1 A 0 0 0 0
T1 B 1 0 0 0
T2 A 0 1 0 0
T2 B 0 0 1 0
T2 C 0 0 0 1
T3 A 0 0 0 0
T3 B 0 0 0 1
T4 A 0 0 0 0
T5 A 0 1 0 0
【讨论】:
是否可以选择将硬代码 name_type 像 decode(n.code,'AN',a.value,0) 删除为“AN”,这里的存储过程对我也有好处。跨度> @AnshulDubey 不幸的是,没有。以上是关于需要sql或者存储过程根据flag获取数据吗?的主要内容,如果未能解决你的问题,请参考以下文章
sql存储过程,根据多个条件查询,返回一个dataTable或者DataSet