2013-03-06 3 views
2

Я пытаюсь добавить промежуточные итоги в конец моего вывода к этому коду с помощью ROLLUP, но это не говорит о том, что они не входят в группу. Я не хочу, чтобы они были сгруппированы, я просто хочу, чтобы промежуточные итоги были внизу.SQL: свертывание без группировки

SELECT Date, HomeTeam, AwayTeam, FTHG, FTAG, FTR, 
CASE WHEN HomeTeam = 'Arsenal' THEN 
CASE FTR WHEN 'H' THEN 3 WHEN 'D' THEN 1 WHEN 'A' THEN 0 ELSE 0 END 
WHEN AwayTeam = 'Arsenal' THEN 
CASE FTR WHEN 'H' THEN 0 WHEN 'D' THEN 1 WHEN 'A' THEN 3 ELSE 0 END 
ELSE 0 
END 
AS Points, CASE WHEN HomeTeam = 'Arsenal' THEN FTHG - FTAG 
      WHEN AwayTeam = 'Arsenal' THEN FTAG - FTHG 
      ELSE 0 
      END AS GD 
FROM [Games].[dbo].[Master] 
WHERE (HomeTeam = 'Arsenal' OR AwayTeam = 'Arsenal') AND Date < '20121201' 
ORDER BY Date DESC 

Так как идентификатор выходного сигнала в обычном режиме, но с рядом на дне, с HomeTeam = «Total», Очки = (сумма баллов колонки), GD = (сумма столбца GD).

Date      HomeTeam   AwayTeam  FTHG FTAG FTR Points GD 
----------------------- --------------- ----------- ---- ---- --- ------ -- 
2012-11-28 00:00:00.000 Everton   Arsenal  1  1  D 1  0 
2012-11-24 00:00:00.000 Aston Villa  Arsenal  0  0  D 1  0 
2012-11-17 00:00:00.000 Arsenal   Tottenham 5  2  H 3  3 
2012-11-10 00:00:00.000 Arsenal   Fulham  3  3  D 1  0 
2012-11-03 00:00:00.000 Man Utd   Arsenal  2  1  H 0  -1 
2012-10-27 00:00:00.000 Arsenal   QPR   1  0  H 3  1 
2012-10-20 00:00:00.000 Norwich City  Arsenal  1  0  H 0  -1 
2012-10-06 00:00:00.000 West Ham United Arsenal  1  3  A 3  2 
2012-09-29 00:00:00.000 Arsenal   Chelsea  1  2  A 0  -1 
2012-09-23 00:00:00.000 Manchester City Arsenal  1  1  D 1  0 
2012-09-15 00:00:00.000 Arsenal   Southampton 6  1  H 3  5 
2012-09-02 00:00:00.000 Liverpool  Arsenal  0  2  A 3  2 
2012-08-26 00:00:00.000 Stoke City  Arsenal  0  0  D 1  0 
2012-08-18 00:00:00.000 Arsenal   Sunderland 0  0  D 1  0 

Возможно ли это?

+1

bluefeet на помощь !!!!!!!!!!! –

+1

Вы можете добавить два дополнительных столбца в вывод и сохранить текущие итоги по мере того, как вы идете вместе с SUM (точками) OVER' и 'SUM (GD) OVER'. Или, если вы действительно хотите, поместите запрос в CTE, а затем запросите запрос CTE UNION на сумму, которую вы хотите получить от CTE. – Glenn

+0

Итак, я добавил «SUM (Points) OVER() AS pSum» в конец моего оператора select, но он говорит, что «Точки» - это недопустимое имя столбца, возможно, поскольку оно создается во время операции select, есть ли способ вокруг этого? – user2096512

ответ

2

Вы можете использовать CROSS APPLY для расчета Points и GD. Таким образом, вы сможете ссылаться на результаты в том же SELECT:

SELECT 
    m.Date, 
    m.HomeTeam, 
    m.AwayTeam, 
    m.FTHG, 
    m.FTAG, 
    m.FTR, 
    x.Points, 
    x.GD, 
    TotalPoints = SUM(x.Points) OVER(), 
    TotalGD  = SUM(x.GD) OVER() 
FROM [Games].[dbo].[Master] AS m 
CROSS APPLY (
    SELECT 
    Points = CASE 
     WHEN m.FTR = 'D' THEN 1 
     WHEN m.FTR = 'H' AND m.HomeTeam = 'Arsenal' 
     OR m.FTR = 'A' AND m.AwayTeam = 'Arsenal' THEN 3 
     ELSE 0 
    END, 
    GD = CASE m.HomeTeam 
     WHEN 'Arsenal' 
     THEN m.FTHG - m.FTAG 
     ELSE m.FTAG - m.FTHG 
    END 
) AS x 
WHERE (m.HomeTeam = 'Arsenal' OR m.AwayTeam = 'Arsenal') AND m.Date < '20121201' 
ORDER BY m.Date DESC 
; 
+0

Спасибо за все ваши ответы, я пошел с этим, прекрасно работает. Приветствия. – user2096512

2

Вы не указывается, какая версия SQL Server вы используете, но если вы используете SQL Server 2008+, то вы должны быть в состоянии сделать это с помощью GROUPING SETS, чтобы получить свернутую строку:

;with cte as 
(
    SELECT Date, 
    HomeTeam, 
    AwayTeam, 
    FTHG, 
    FTAG, 
    FTR, 
    CASE 
     WHEN HomeTeam = 'Arsenal' 
     THEN 
      CASE FTR 
      WHEN 'H' THEN 3 
      WHEN 'D' THEN 1 
      WHEN 'A' THEN 0 
      ELSE 0 END 
     WHEN AwayTeam = 'Arsenal' 
     THEN 
      CASE FTR 
      WHEN 'H' THEN 0 
      WHEN 'D' THEN 1 
      WHEN 'A' 
      THEN 3 
      ELSE 0 END 
     ELSE 0 
    END AS Points, 
    CASE 
     WHEN HomeTeam = 'Arsenal' THEN FTHG - FTAG 
     WHEN AwayTeam = 'Arsenal' THEN FTAG - FTHG 
     ELSE 0 
    END AS GD 
    FROM [Games].[dbo].[Master] 
    WHERE (HomeTeam = 'Arsenal' OR AwayTeam = 'Arsenal') AND Date < '20121201' 
) 
select 
    coalesce(convert(char(10), date, 120), 'Total')date, 
    coalesce(hometeam, '') hometeam, 
    coalesce(awayteam , '') awayteam, 
    sum(fthg) fthg, 
    sum(ftag) ftag, 
    coalesce(ftr, '') ftr, 
    sum(points) points, 
    sum(gd) gd 
from cte 
group by grouping sets((date, hometeam, awayteam, ftr),()) 

См. SQL Fiddle with Demo.

Если вы работаете в SQL Server 2005+, то вы можете также использовать ROLLUP():

;with cte as 
(
    SELECT Date, 
    HomeTeam, 
    AwayTeam, 
    FTHG, 
    FTAG, 
    FTR, 
    CASE 
     WHEN HomeTeam = 'Arsenal' 
     THEN 
      CASE FTR 
      WHEN 'H' THEN 3 
      WHEN 'D' THEN 1 
      WHEN 'A' THEN 0 
      ELSE 0 END 
     WHEN AwayTeam = 'Arsenal' 
     THEN 
      CASE FTR 
      WHEN 'H' THEN 0 
      WHEN 'D' THEN 1 
      WHEN 'A' 
      THEN 3 
      ELSE 0 END 
     ELSE 0 
    END AS Points, 
    CASE 
     WHEN HomeTeam = 'Arsenal' THEN FTHG - FTAG 
     WHEN AwayTeam = 'Arsenal' THEN FTAG - FTHG 
     ELSE 0 
    END AS GD 
    FROM games 
    WHERE (HomeTeam = 'Arsenal' OR AwayTeam = 'Arsenal') AND Date < '20121201' 
) 
select 
    coalesce(convert(char(10), date, 120), 'Total')date, 
    coalesce(hometeam, '') hometeam, 
    coalesce(awayteam , '') awayteam, 
    sum(fthg) fthg, 
    sum(ftag) ftag, 
    coalesce(ftr, '') ftr, 
    sum(points) points, 
    sum(gd) gd 
from cte 
group by rollup((date, hometeam, awayteam, ftr)) 

См SQL Fiddle with Demo

+1

Вы можете заменить «группирующие наборы ((date, hometeam, awayteam, ftr),())' с 'rollup ((date, hometeam, awayteam, ftr))', и это сделает запрос выполнимым в SQL Server 2005. –

+0

@AndriyM Я просто работал над этой версией для публикации. :) – Taryn

+0

Ах, извините за мое нетерпение. :) –

Смежные вопросы