sql-server - T-SQL - 基于两列获取数据

标签 sql-server tsql sql-server-2012

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

sample

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

可以用 case when 语句解决这个问题吗?

由于 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')

我无法让它工作。

希望你能帮助我。

非常感谢。

最佳答案

使用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

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

关于sql-server - T-SQL - 基于两列获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35888621/

相关文章:

.net - 生成发票

sql - @@ROWCOUNT 检查未检测到零行数

sql - T-SQL GO 语句 n 次

sql - sql 中的匹配列表

SQL Server记录字符串匹配后的链接

c# - 子集和问题

sql - 意外的 rand() 行为?

sql - 将后续日期分组到垃圾箱中

sql-server - T-SQL 固定宽度输出

sql - 使用时间戳过滤/WHERE