T-SQL - 根据两列获取数据

时间:2016-03-09 10:13:08

标签: sql-server tsql sql-server-2012

我想从下图中创建以下输出:

sample

输入数据来自视图(Select * from test)。目标是获取progress列包含文本tbdcounter数字为1的所有数据。

这可以用语句解决吗?

由于sqlfiddle不在这里,所以是架构:

CREATE TABLE test
(
    [ID] [int] NOT NULL,
    [Counter] [int] NOT NULL,
    [Name] nvarchar(200) NULL,
    [Progress] nvarchar(200) NOT NULL
)

INSERT INTO test
VALUES (1, 1, 'userA', 'tbd'),
       (1, 2, 'userB', 'done'),
       (1, 3, 'userC', 'tbd'),
       (2, 1, 'userB', 'done'),
       (2, 5, 'userA', 'tbd'),
       (3, 1, 'userD', 'tbd'),
       (3, 2, 'userA', 'done'),
       (3, 7, 'userC', 'tbd'),
       (3, 11, 'userB', 'tbd')

我无法让它发挥作用。

希望你能帮助我。

非常感谢。

3 个答案:

答案 0 :(得分:2)

使用Exists子句可以达到理想的效果。

<强>查询

SELECT
    *
FROM test t
WHERE EXISTS (SELECT 1 FROM test
            WHERE t.ID = ID
            AND progress = 'tbd'
            AND counter = 1)

<强>结果

ID  Counter  Name    Progress
-----------------------------
1      1     userA   tbd
1      2     userB   done
1      3     userC   tbd
3      1     userD   tbd
3      2     userA   done
3      7     userC   tbd
3      11    userB   tbd

另一个替代解决方案很简单SELF JOIN就像这样 -

<强>查询

SELECT
    le.ID, le.Counter, le.Name, le.Progress
    FROM test le
INNER JOIN test re ON le.ID = re.ID
WHERE re.progress = 'tbd'
    AND re.counter = 1

以上查询返回相同的结果。

答案 1 :(得分:1)

只需尝试:

select * from test where progress = 'tbd' and counter = 1

答案 2 :(得分:1)

也许这会对你有所帮助:

select  *,
        row_number() over(partition by    Progress order by   Counter)
        rowID
into #tmp
from    Test

select  *
from    #tmp
where   ID in(
            select  ID
            from    #tmp
            where   Counter = 1
                    and Progress = 'tbd'
        )
order by    ID,
            rowID