SQL查询只显示一个具有多个记录的值

时间:2016-06-10 09:59:54

标签: sql

我有这种记录

project   vendor  value
------------------------
A          HDFC   23
B          HDFC   20
A          HDFC   52
c          CITI   56
------------------------

输出

project   vendor   value
---------------------------
A         HDFC      23
-          -        52
B          -        20
c         CITI      56
---------------------------    

5 个答案:

答案 0 :(得分:0)

您没有指定DBMS,因此这是标准的ANSI SQL:

select project, 
       case 
            when row_number() over (partition by vendor order by project) = 1 then vendor 
            else '-' 
       end as vendor,
       value
from the_table
order by project, row_number() over (partition by vendor order by project);

SQLFiddle:http://sqlfiddle.com/#!15/f77b0/1

答案 1 :(得分:0)

试试这个:

SELECT *, ROW_NUMBER() OVER (ORDER BY project, vendor) SNo
INTO #ordered
FROM YourTable

UPDATE o
SET o.project = CASE WHEN last.project = o.project THEN '-' ELSE o.project END, o.vendor = CASE WHEN last.vendor = o.vendor THEN '-' ELSE o.vendor END
FROM #ordered o 
LEFT OUTER JOIN #ordered last ON last.SNo = o.SNo - 1

SELECT project, vendor, value 
FROM #ordered

答案 2 :(得分:0)

above answer的一个小变化,以接近预期的输出

select project, 
       case  when row_number() over (partition by project) = 1 then project 
            else '-'
       end as new_project, 
       case when row_number() over (partition by vendor order by project) = 1 then vendor 
            else '-'
       end as vendor,
       value
from projects
order by project, row_number() over (partition by vendor order by project);

project new_project vendor  value
A       A           HDFC    23
A       -           -       52
B       B           -       20
c       c           CITI    56

答案 3 :(得分:0)

使用第一个答案我认为我们应该在项目列中添加相同的逻辑与原始问题完全匹配:

select 
case 
    when row_number() over (partition by project) = 1 then project 
    else '-'
end as project, 
case 
    when row_number() over (partition by vendor order by project) = 1 then vendor 
    else '-'
end as vendor,
value
from projects
order by row_number() over (partition by vendor)

答案 4 :(得分:0)

在MS SQL中:

select project,vendor,value from (
select 
row_number() over (partition by vendor order by project) as number,
case 
    when row_number() over (partition by project order by vendor) = 1 then project 
    else '-'
end as project, 
case 
    when row_number() over (partition by vendor order by project) = 1 then vendor 
    else '-'
end as vendor,
value
from [Vendors]
) as S
order by number

它就像你想要的那样工作!