sql group by month and year with one row id

时间:2016-03-04 14:51:57

标签: sql sql-server

我有一个月,年和一个像这样的id的表。

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

我想要一个sql查询,每个月/每年只给我一行,如果是单个,则为id,如果该月份有多行,则为id null。

在上面的案例中

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

我该如何查询qith sql server 2012?

4 个答案:

答案 0 :(得分:3)

您可以使用聚合和case

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

注意:monthyear是列的错误名称,因为它们是保留字。如果这些是您的列的名称,则需要将它们转义。

答案 1 :(得分:0)

**问题:**每月每年只有一行,如果是单个,则id为if,如果该月份有多行,则id为null

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

答案 2 :(得分:0)

我错过了关于OP中的NULL的部分,这是一个调整后的查询

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

答案 3 :(得分: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;