需要SQL查询来获取条件输出

时间:2015-06-18 04:41:22

标签: sql sql-server

有一个表Table1,其行如下所示。列Label存储列Tag的优先级。

同样在列Label中 - L1是第一优先级,L2是第二优先级,L3是最低优先级。

我有Value列,其中包含标记的值,可以为null。

RecordNo.   Lable   Tag  Value
----------------------------------------------
1           L1      T1  
2           L2      T1   D12
3           L3      T1   D13
4           L1      T2   D21
5           L2      T2  
6           L3      T3  
7           L2      T3   D31
8           L2      T4  
9           L3      T4   D41
10          L3      T5   D51

我想编写一个查询来获取如下输出。

对于每个Tag,如果找不到L1的值,那么我们将搜索L2,如果找不到L2数据,则搜索L3.So在任何时候它都应该返回非空值的标记。

输出如下所示。

RecordNo.   Lable   Tag  Value
---------------------------------------------------------
2           L2      T1   D12
4           L1      T2   D21
7           L2      T3   D31
9           L3      T4   D41
10          L3      T5   D51

任何人都可以查看以上查询吗?

提前致谢。

5 个答案:

答案 0 :(得分:3)

您可以使用ROW_NUMBER

;WITH Cte AS(
    SELECT *,
        RN = ROW_NUMBER() OVER(PARTITION BY Tag ORDER BY Lable)
    FROM Table1
    WHERE Value IS NOT NULL
)
SELECT 
    RecordNo, Lable, Tag, Value
FROM Cte
WHERE RN = 1

SQL Fiddle

答案 1 :(得分:0)

cte with Min应该做的伎俩

;WITH cte AS (
    SELECT  Tag,
            MIN(Lable) AS Lable
    FROM    Table1
    WHERE   Value IS NOT NULL 
    GROUP BY Tag
)
SELECT  *
FROM    Table1 t1
        JOIN cte c ON t1.Lable = c.Lable 
            AND t1.Tag = c.Tag

答案 2 :(得分:0)

使用此代码:

create table #test 
(
Record_no int,
label varchar(4),
Tag varchar(4),
Value varchar(6)
)
insert into #test values(1,'L1','T1','')
insert into #test values(2,'L2','T1','D12')
insert into #test values(3,'L3','T1','D13')
insert into #test values(4,'L1','T2','D21')
insert into #test values(5,'L2','T2','')
insert into #test values(6,'L3','T3','')
insert into #test values(7,'L2','T3','D31')
insert into #test values(8,'L2','T4','')
insert into #test values(9,'L3','T4','D41')
insert into #test values(10,'L3','T5','D51')

Select * from #test

;With Cte as
(
Select *,ROW_NUMBER() over (partition by tag order by tag) as rownum
from #test
where Value<>''
)
select Record_no,label,tag,value from CTE 
where ROWNUM=1

输出:

Record_no   label   tag value
   2         L2     T1  D12
   4         L1     T2  D21
   7         L2     T3  D31
   9         L3     T4  D41
  10         L3     T5  D51

答案 3 :(得分:0)

如果我们假设表名是记录,那么查询将如下所示。

with recordcte(recordno, label, tag, value,Rank) as
(select recordno, 
        label,
        tag,
        value, 
        rank() over(partition by Tag order by newid() ) 
from records where value is not null)
select recordno,
       label,
       tag,
       value 
from recordcte where Rank=1

以下查询,即CTE(公用表表达式)

的定义

select recordno, label, tag, value, rank() over(partition by Tag order by newid() from records where value is not null)

正在消除值列中具有null的行,并通过在行标记值上对它们进行分区来为行生成排名。

关于CTE的以下查询

select recordno, label,tag,value from recordcte where Rank=1

将仅显示排名为1的行,以便您获得与值相关联的标记,该标记也是与该值关联的第一个标记。

我希望这能满足你的要求。

答案 4 :(得分:0)

您可以设置L1,L2,L3或L3,L1,L2或L2,L3,L1的顺序

从Table1中选择不同的Lable,Tag,Value,其中Lable = L1  联盟  从Table1中选择不同的Lable,Tag,Value  Lable = L2和  标记不在(从表1中选择不同的标签,其中Lable在(L1)中)  联盟  从Table1中选择不同的Lable,Tag,Value  Lable = L3且Tag not in(从表1中选择不同的标签,其中为  Lable in(L1,L2))****