SQL Server - оператор использования в группе - PullRequest
2 голосов
/ 04 августа 2011

Я пытаюсь создать представление следующим образом:

CREATE VIEW vw1 AS SELECT     
  Town
, case when (Spend > 0 and NbOrders > 0)
       then sum(Spend)/sum(NbOrders)
       else null
       end as AvgSpend
, case when (Margin > 0 and NbOrders > 0)
       then sum(Margin)/sum(NbOrders)
       else null
       end as AvgMargin
FROM Table
group by Town

Но я получаю ошибку, потому что поля, используемые в моем операторе 'case when ...', не включены в статистическую функцию.

Я не могу использовать предложение 'where', потому что средние поля зависят от того, что разные поля>> 0, и я не вижу, как я могу это сделать, работая с агрегированным полем?

Есть идеи, как мне этого добиться - желательно в одном утверждении?

Ответы [ 4 ]

1 голос
/ 04 августа 2011
CREATE VIEW vw1 AS
SELECT
  Town
, SUM(CASE WHEN Spend > 0 THEN Spend END)
  / SUM(CASE WHEN NbOrders > 0 THEN NbOrders END) AS AvgSpend
, SUM(CASE WHEN Margin > 0 THEN Margin END)
  / SUM(CASE WHEN NbOrders > 0 THEN NbOrders END) AS AvgMargin
FROM Table
GROUP BY Town
0 голосов
/ 04 августа 2011
CREATE VIEW vw1 AS SELECT     
  Town
, case when (Spend > 0 and NbOrders > 0)
       then sum(Spend)/sum(NbOrders)
       else null
       end as AvgSpend
, case when (Margin > 0 and NbOrders > 0)
       then sum(Spend)/sum(NbOrders)
       else null
       end as AvgMargin
FROM Table
group by Town, AvgSpend, AvgMargin 
0 голосов
/ 04 августа 2011

Обновлено ... спасибо @Andriy M

SELECT town

,SUM(CASE WHEN Spend > 0 and NbOrders > 0 THEN Spend END)
/SUM(CASE WHEN Spend > 0 and NbOrders > 0 THEN NbOrders END)  As AvgSpend

,SUM(CASE WHEN Margin > 0 and NbOrders > 0 THEN Margin END)
/ SUM(CASE WHEN Margin > 0 and NbOrders > 0 THEN NbOrders END) As AvgMargin

FROM table
GROUP BY town
0 голосов
/ 04 августа 2011

вам просто нужно включить group by в каждый «кейс».

что-то вроде ниже:

CREATE VIEW vw1 AS SELECT     
  Town
, case when (Spend > 0 and NbOrders > 0)
       then sum(Spend)/sum(NbOrders)
       group by Town
       else null
       end as AvgSpend
, case when (Margin > 0 and NbOrders > 0)
       then sum(Spend)/sum(NbOrders)
       group by Town
       else null
       end as AvgMargin
FROM Table
...