需要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

2008SQL 存储过程中可以创建视图吗

将存储过程 PL/SQL 转换为 Java

如何在sqlserver的存储过程中,实现根据输入的参数获取数据表中的对应列的数据

sql server 存储过程如何调用存储过程

通过oracle dblink,怎么执行远程数据库的存储过程。或者说可以执行吗?怎么弄?