2016-03-04 61 views
-1

我有一個表,月份,年份和這樣的id。sql group每月和每年的一行id

+-------+-----------+----- 
| month | year | id 
+-------+-----------+----- 
| 1  | 2016  |1 
+-------+-----------+----- 
| 2  | 2016  |2 
+-------+-----------+----- 
| 2  | 2016  |3 
+-------+-----------+----- 

,我想一個SQL查詢,給我每月/每年只有一排與ID,如果是單一的或者ID爲空,如果有多個列該月的一年。

以上

+-------+-----------+----- 
| month | year | id 
+-------+-----------+----- 
| 1  | 2016  |1 
+-------+-----------+----- 
| 2  | 2016  |null 
+-------+-----------+----- 

的情況下

我怎麼能做到這一點查詢qith的SQL Server 2012?

+0

你可以添加兩個相等的行,都(3,2016,4),並調整預期的結果? – jarlh

+0

jarlh,正確的結果我想對應於戈登Linodd的答案,謝謝 – user3401335

回答

3

您可以通過聚集和case做到這一點:

select month, year, 
     (case when min(id) = max(id) then min(id) end) as id 
from t 
group by month, year; 

注:monthyear是列的壞話,因爲他們是保留字。如果這些確實是你的專欄的名字,你將需要逃避它們。

+0

我認爲用戶期望空值如果有多個值...只有一行每月/年與id如果是單身或ID爲null如果當月有多行 – TheGameiswar

+0

如果一年/月發現兩次相同的ID,它將被返回。據我瞭解,在這種情況下預計NULL。 – jarlh

+0

@jarlh。 。 。有趣。我將問題解釋爲行中具有「單個值」的id。這個問題不明確。 –

0

**問題:**每月/每年只有一排與ID,如果是單一的或者ID爲空,如果有多個行當月一年

with cte 
    as 
    (
    select row_number() over (partition by month,year order by (Select 1)) as rn, 
    month,year,id 
    from 
    table 
    ) 
    select 
    case when rn>1 then null else id end as 'id', 
    month, 
    year 
    from 
    cte 
0

我錯過了有關NULL的部分在OP,這裏是一個調整的查詢

DECLARE @tbl TABLE 
(
    Month INT NOT NULL, 
    Year INT NOT NULL, 
    Id INT NOT NULL 
) 

INSERT INTO @tbl VALUES 
    (2016, 1, 1) 
    ,(2016, 2, 2) 
    ,(2016, 2, 3) 

SELECT 
    Month 
    ,Year 
    ,CASE WHEN COUNT(Id) > 1 THEN NULL ELSE COUNT(Id) END AS [Id] 
FROM @tbl 
GROUP BY Month, Year 

http://rextester.com/FWVHI57098

0

做一個GROUP BY每月和每年的行數的計數。有一個case表達式,如果一行使用min(id)返回它,否則(多於1行)返回null。

select month, year, case when count(*) = 1 then min(id) else null end 
from tablename 
group by month, year;