2016-03-04 2 views
-1

У меня есть таблица с месяцем, годом и идентификатором, подобным этому.sql group по месяцам и году с одной строкой id

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

и я хочу SQL запрос, который даст мне только одну строку в месяц/год с идентификатором, если холост или идентификатор нулевой, если есть несколько строк для этого месяца года.

в случае выше

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

, как я могу это сделать qith запрос SQL Server 2012?

+0

Можете ли вы добавить две равные строки, как (3, 2016, 4), так и скорректировать ожидаемый результат? – jarlh

+0

jarlh, правильный результат, я хочу соответствовать ответу Гордона Линодда, спасибо – user3401335

ответ

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 плохие имена для столбцов, поскольку они являются зарезервированными словами. Если это действительно имена ваших столбцов, вам нужно будет их избежать.

+0

Я думаю, что пользователь ожидает нулевого значения, если есть несколько значений ... только одна строка в месяц/год с идентификатором if, если один или id null, если есть несколько строк за этот месяц год – TheGameiswar

+0

Если такой же идентификатор найден дважды в год/месяц, он будет возвращен. Насколько я понимаю, в этом случае ожидается NULL. – jarlh

+0

@jarlh. , , Интересно. Я интерпретировал этот вопрос как идентификатор, имеющий «единственное значение» в строках. Вопрос неоднозначен. –

0

** Вопрос: ** только один ряд в месяц/год с идентификатором, если холост или нулевой идентификатор, если есть несколько строк для этого месяца года

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 в ОП, вот скорректированный запрос,

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), в противном случае (более одной строки) возвращает null.

select month, year, case when count(*) = 1 then min(id) else null end 
from tablename 
group by month, year; 
Смежные вопросы