为重复ID仅列出一次列的值

时间:2017-04-04 15:33:33

标签: sql oracle

我需要帮助修改我的查询,以便每个ProjectID只显示一次PlannedAmount。具有重复ProjectID的任何行都应具有null的PlannedAmount。

基准表:

+------------------------------------+
| ProjectID SegmentName   CurrentMTD |
+------------------------------------+
| 100       Taxes-state    20000     |
| 100       Taxes-federal 100000     |
| 101       Building           0     |
| 102       Land               0     |
| 103       Equipment      25000     |
+------------------------------------+

PlannedAmounts表:

+-------------------------+
| ProjectID PlannedAmount |
+-------------------------+
| 100       140000        |
| 103        30000        |
+-------------------------+

我的查询:

SELECT a.ProjectID, a.SegmentName, a.CurrentMTD, NVL(b.PlannedAmount, 0) as PlannedAmount 
FROM Base AS a LEFT JOIN PlannedAmounts AS b ON a.ProjectID = b.ProjectID;

结果:

+---------------------------------------------------+
| ProjectID SegmentName   CurrentMTD  PlannedAmount |
+---------------------------------------------------+
| 100       Taxes-state    20000      140000        |
| 100       Taxes-federal 100000      140000        |
| 101       Building           0           0        |
| 102       Land               0           0        |
| 103       Equipment      25000       30000        |
+---------------------------------------------------+

我想要的是什么:

+---------------------------------------------------+
| ProjectID SegmentName   CurrentMTD  PlannedAmount |
+---------------------------------------------------+
| 100       Taxes-state    20000      140000        |
| 100       Taxes-federal 100000                    |
| 101       Building           0           0        |
| 102       Land               0           0        |
| 103       Equipment      25000       30000        |
+---------------------------------------------------+

我不想为任何重复的ProjectID重复PlannedAmount - 我只想显示一次 - 在任何给定ProjectID的第一次出现时。

1 个答案:

答案 0 :(得分:2)

您可以使用Case和Row_Number(),修改后的查询

SELECT a.ProjectID, a.SegmentName, a.CurrentMTD, Case when Row_number() (over partition by a.ProjectId order by a.ProjectId) = 1 then NVL(b.PlannedAmount, 0) else NULL end as PlannedAmount  
    FROM Base AS a LEFT JOIN PlannedAmounts AS b ON a.ProjectID = b.ProjectID;