我有一个情况,我有一个表格,其中一个标志分配给列名称(如'Y'或'N')。如果有一个特定的值,我必须选择一行的列名。
我的表:
Name|sub-1|sub-2|sub-3|sub-4|sub-5|sub-6| ----------------------------------------- Tom | Y | | Y | Y | | Y | Jim | Y | Y | | | Y | Y | Ram | | Y | | Y | Y | |
所以我需要得到,所有潜艇都有特定名称的'Y'标志。 例如:
如果我选择
Tom,我需要在查询输出中获取“Y”列名称列表。
Subs ____ sub-1 sub-3 sub-4 sub-6
非常感谢您的帮助。
答案 0 :(得分:1)
下面的代码适用于我。
select t.Subs from (select name, u.subs,u.val
from TableName s
unpivot
(
val
for subs in (sub-1, sub-2, sub-3,sub-4,sub-5,sub-6,sub-7)
) u where u.val='Y') T
where t.name='Tom'
答案 1 :(得分:1)
问题是您的数据库模型未规范化。如果它被正确规范化,查询将很容易。因此,解决方法是“动态”规范化模型,以便能够进行查询:
select col_name
from (
select name, sub_1 as val, 'sub_1' as col_name
from the_table
union all
select name, sub_2, 'sub_2'
from the_table
union all
select name, sub_3, 'sub_3'
from the_table
union all
select name, sub_4, 'sub_4'
from the_table
union all
select name, sub_5, 'sub_5'
from the_table
union all
select name, sub_6, 'sub_6'
from the_table
) t
where name = 'Tom'
and val = 'Y'
以上是标准SQL,应该适用于任何(关系型)DBMS。
答案 2 :(得分:0)
不知何故,我接近解决方案。我可以获得所有行。 (我只使用了2列)
select col from ( select col, case s.col when 'sub-1' then sub-1 when 'sub-2' then sub-2 end AS val from mytable cross join ( select 'sub-1' AS col union all select 'sub-2' ) s ) s where val ='Y'
它给出了所有行的列。我需要一行的相同数据。就像我选择" Tom",我需要' Y'的列名。值。
答案 3 :(得分:0)
我在这里做了几个假设来回答这个问题。首先是你知道有问题的表的列的名称。其次,这是SQL Server。 Oracle和MySql有办法执行此操作,但我不知道其语法。
无论如何,我所做的就是表演“不安全”。关于数据。
那里有很多说法,所以要解释一下。实际的' unpivot' statement(别名为UNPVT)获取数据并将列转换为行,与之关联的SELECT提供正在返回的数据。我在这里使用了'名称',并将列名放在' Subs'列和相应的值进入' Val'柱。确切地说,我正在谈论上述代码的这一方面:
SELECT [Name], [Subs], [Val]
FROM
(SELECT [Name], [Sub-1], [Sub-2], [Sub-3], [Sub-4], [Sub-5], [Sub-6]
FROM pvt) p
UNPIVOT
(Orders FOR [Name] IN
([Name], [Sub-1], [Sub-2], [Sub-3], [Sub-4], [Sub-5], [Sub-6])
)AS unpvt
我的下一步是做出一个'子选择'在哪里我可以找到被追捕的具体名称和val。这将为您提供一个沿着这些行看起来的SQL语句
SELECT [Name], [Subs], [Val]
FROM (
SELECT [Name], [Subs], [Val]
FROM
(SELECT [Name], [Sub-1], [Sub-2], [Sub-3], [Sub-4], [Sub-5], [Sub-6]
FROM pvt) p
UNPIVOT
(Orders FOR [Name] IN
([Name], [Sub-1], [Sub-2], [Sub-3], [Sub-4], [Sub-5], [Sub-6])
)AS unpvt
) AS pp
WHERE 1 = 1
AND pp.[Val] = 'Y'
AND pp.[Name] = 'Tom'
答案 4 :(得分:-1)
select col from (
select col,
case s.col
when 'sub-1' then sub-1
when 'sub-2' then sub-2
when 'sub-3' then sub-3
when 'sub-4' then sub-4
when 'sub-5' then sub-5
when 'sub-6' then sub-6
end AS val
from mytable
cross join
(
select 'sub-1' AS col union all
select 'sub-2' union all
select 'sub-3' union all
select 'sub-4' union all
select 'sub-5' union all
select 'sub-6'
) s on name="Tom"
) s
where val ='Y'
将加入条件包括为
在名称=“ Tom”上