【问题标题】:T-SQL - get data based on two columnsT-SQL - 基于两列获取数据
【发布时间】:2016-03-09 10:13:07
【问题描述】:

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

输入数据来自视图 (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')

我无法让它工作。

希望你能帮帮我。

非常感谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • @Vland:简单的WHERE 只为您提供 2 行,这不是 OP 想要的输出。您可以使用有问题的 OP 提供的脚本自行检查。
    • 好吧,我的错。我认为 获取进度列包含文本 tbd 且计数器编号为 1 的所有数据 意味着仅检索 2 行!感谢他,他发布了截图
    【解决方案2】:

    试试吧:

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

    【讨论】:

      【解决方案3】:

      也许这会对你有所帮助:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-19
        • 1970-01-01
        • 1970-01-01
        • 2019-06-19
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 2018-10-28
        相关资源
        最近更新 更多