2016-03-18 2 views
3

У меня есть таблица (MyTable) с 3 столбцами; Номер, Строка, Сумма.
Если номер совпадает с более чем тремя записями, я хочу вернуть эти записи, сгруппированные по номеру. В противном случае я хочу, чтобы все записи были сгруппированы по номерам и линиям.Group By Count и поле в том же запросе

Это то, что я получил до сих пор. Это дает ошибку, как линия должна быть в агрегированной функции

select * (
select Number, (case when count(Line) > 3 then -1 else Line end) as Line2, sum(Amount) 
from MyTable 
group by Number, Line2 
) as x 
order by x.Number 

MyTable выглядит примерно так:

Number Line Amount 
------------------------ 
1   1  100 
1   1  100 
1   2  200 
1   2  200 
2   1  150 
2   1  150 
3   1  300 
3   2  350 

Я хочу результат выглядеть примерно так:

Number Line2 Amount 
------------------------ 
1   -1  600 <- More than 3 lines 
2   1  300 <- Grouped by Line 
3   1  300  
3   2  350  
+1

является отрицательным значением по умолчанию? – Sherlock

ответ

4

Try это:

SELECT Number, -1 AS Line, SUM(Amount) AS Amount 
FROM mytable 
GROUP BY Number 
HAVING COUNT(*) > 3 

UNION 

SELECT Number, Line, SUM(Amount) AS Amount 
FROM mytable 
WHERE Number NOT IN (SELECT Number 
        FROM mytable 
        GROUP BY Number 
        HAVING COUNT(*) > 3) 
GROUP BY Number, Line 
+0

во втором запросе, можем ли мы использовать меньше условия 'HAVING COUNT (*) <= 3' для удаления' IN'? – Sherlock

+1

@EuphoriaGrogi Я думаю, что нет, потому что в этом случае группировка отличается. –

+0

ах, я вижу, им просто любопытно :) – Sherlock

3

Вы можете использовать CTE, как это:

DECLARE @t table 
(Number int,Line int,Amount int) 

INSERT @t VALUES 
    (1,1,100),(1,1,100),(1,2,200), 
    (1,2,200),(2,1,150),(2,1,150), 
    (3,1,300),(3,2,350) 

;WITH CTE as 
(
    SELECT 
    Number, Line, Amount, 
    count(*) over (partition by number) cnt 
FROM @t 
) 
SELECT 
    Number, 
    CASE WHEN cnt < 3 THEN Line ELSE -1 END Line2, 
    SUM(Amount) Amount 
FROM CTE 
GROUP BY number, CASE WHEN cnt < 3 THEN Line ELSE -1 END 

Результат:

Number Line Amount 
1  -1  600 
2  1  300 
3  1  300 
3  2  350 
Смежные вопросы