我有一个月,年和一个像这样的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?
答案 0 :(得分:3)
您可以使用聚合和case
:
select month, year,
(case when min(id) = max(id) then min(id) end) as id
from t
group by month, year;
注意:month
和year
是列的错误名称,因为它们是保留字。如果这些是您的列的名称,则需要将它们转义。
答案 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
答案 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;