2016-03-09 22 views
7

Tôi muốn tạo đầu ra sau đây từ bên dưới hình ảnh:T-SQL - lấy dữ liệu dựa trên hai cột

dữ liệu

sample

Đầu vào là từ một cái nhìn (Select * from test). Mục tiêu là lấy tất cả dữ liệu trong đó cột progress chứa văn bản tbd và số counter là 1.

Điều này có thể được giải quyết khi có tuyên bố không?

Kể từ sqlfiddle không hoạt động ở đây là schema:

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

tôi không thể có được nó để làm việc.

Hy vọng bạn có thể giúp tôi.

Cảm ơn rất nhiều.

Trả lời

2

Sử dụng Exists khoản bạn có thể đạt được kết quả mong muốn của bạn.

Query

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

quả

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 

khác thay thế giải pháp là đơn giản SELF JOIN như this-

Query

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 

Truy vấn trên trả về cùng một kết quả.

+1

tại sao? một WHERE đơn giản là đủ ... – Vland

+0

@Vland: Đơn giản 'WHERE' chỉ cung cấp cho bạn 2 hàng không phải là đầu ra mong muốn của OP. Bạn có thể tự kiểm tra bằng cách sử dụng tập lệnh do OP cung cấp. –

+0

ok của tôi xấu. Tôi nghĩ rằng _get tất cả dữ liệu trong đó cột tiến trình chứa tbd văn bản và số lượt truy cập là 1_ nghĩa là chỉ lấy 2 hàng! cảm ơn anh ấy anh ấy đã đăng ảnh chụp màn hình – Vland

1

Đơn giản chỉ cần thử:

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

Có lẽ đây sẽ giúp bạn:

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 
Các vấn đề liên quan