2016-03-04 62 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;