2016-02-05 82 views
-2

我一直在努力研究如何解决这个问题。T- SQL选择列

我想选择已经在Smith项目上工作并且与项目的smith具有相同小时数的行。任何想法都会很棒。

答案应该是:

Brown X 10 
Brown Y 20 


     Work On Table 

    Smith X 10 
    Smith Y 20 
    Doe  Y 20 
    Brown X 10 
    Doe  Z 30 
    Chang X 10 
    Brown Y 20 
    Brown Z 10 
    Oaks Y 10 
    Oaks X 10 
+0

@MitchWheat编辑,这解开了自己的工作之后,我删除了投票。我不介意缺乏努力,但这是一个很难的问题,并且演示文稿没有显示任何努力。 –

+0

伍迪呢? –

+0

我拿出伍迪。我的意思是早些时候删除该行 – Mmarre

回答

0

SQL-服务器您可以通过窗口函数实现它,是这样的:

QUERY

;with cte as (
    select * 
    from #t 
    where name = 'Smith' 
), cte2 as (
    select ta.*, count(*) over(partition by ta.name) cnt 
    from #t ta 
    join cte ta2 on ta.ranking=ta2.ranking and ta.[time]=ta2.[time] and ta2.name <> ta.name 
) 
select name, ranking, [time] 
from cte2 
where cnt > 1 

样本数据

create table #t 
(
    name nvarchar(60), 
    ranking char(1), 
    [time] int 
) 

insert into #t values 
('Smith','X',10), 
('Smith','Y',20), 
('Doe' ,'Y',20), 
('Brown','X',10), 
('Doe' ,'Z',30), 
('Chang','X',10), 
('Brown','Y',20), 
('Brown','Z',10), 
('Oaks', 'Y',10), 
('Oaks', 'X',10) 

输出

name ranking time 
Brown X  10 
Brown Y  20 
+0

感谢您的关注。在我的方法上,我的方式很顺利。 – Mmarre

+0

@Mmarre别忘了接受正确的答案。检查答案左上方的“V”。 –

1

假设您的列标题是[人],[项目],[时间],因为这是不是在你原来的职位清楚,我建议像下面。道歉,如果这不是你的确切数据,但它改变了很多次!

样本数据:

CREATE TABLE #sample (
    [Person] VARCHAR(10) 
, [Project] CHAR(1) 
, [Hours] INT 
) 

INSERT INTO #sample (Person, Project, Hours) VALUES 
    ('Smith', 'X', 10) 
, ('Smith', 'Y', 20) 
, ('Doe', 'Y', 20) 
, ('Brown', 'X', 10) 
, ('Doe', 'Z', 30) 
, ('Chang', 'X', 10) 
, ('Brown', 'Y', 20) 
, ('Brown', 'Z', 10) 
, ('Woody', 'X', 10) 
, ('Woody', 'Y', 20) 
, ('Oaks', 'Y', 10) 
, ('Oaks', 'Z', 10) 

WITH Results AS (

SELECT 
     b.* -- Get people who are not Smith 
    , rank() OVER (PARTITION BY b.person ORDER BY b.project) AS Reference  -- Work out total number of projects that match 
FROM 
    #sample a 
     INNER JOIN #sample b ON 
       a.Hours = b.Hours 
      AND a.Project = b.Project 
      AND a.person <> b.person 
      AND b.person <> 'Smith' 
WHERE 
    a.person = 'Smith' -- Don't duplicate person of interest into results 
) 


SELECT 
     Person 
    , Project 
    , Hours 
FROM 
    Results 
WHERE 
    Person IN (SELECT person FROM Results WHERE Reference = (SELECT count(DISTINCT project) FROM #sample WHERE Person = 'Smith')) 
+0

非常感谢。我真的正在努力解决这个问题,并且完全以错误的方式接近它 – Mmarre