T-SQL, фильтрующий статистический столбец через CTE или подзапрос со столбцом из представления - PullRequest
0 голосов
/ 31 октября 2018

В SQL Server и я пытаюсь отфильтровать результаты из расчета, где sum(OutShares) > 5. Невозможно использовать агрегат в предложении Where, а наличие только отфильтровывания symbol > 5 не агрегирует агрегат. Я считаю, что мне нужно использовать CTE или подзапрос.

select 
    symbol, sum(qty) * cast(Shares as decimal) As OutShares, last_name
from 
    holding h
join 
    security s on h.id = s.id
join 
    account a on h.p = a.p
join 
    manager m on a.aid = m.id
where 
    OutShares > 5.0
group by 
    symbol, last_name; 

Результаты:

Symbol  OutShares       last_name
---------------------------------
ATI     2.087600649     Jill
ATI     2.546492791     Bernie
ATI     1.13889437      Evie
ATI     1.603800006     Luke
BO      5.00000000      Jack

Желаемые результаты:

Symbol  OutShares       last_name
------------------------------------------------
ATI     7.38            Jill Bernie Evie Luke
BO      5.00            Jack

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Я думаю, что вы хотите

WITH CTE AS
(
  select symbol, sum(qty) * cast(Shares as decimal) As OutShares, last_name
  from holding h
  join security s on h.id=s.id
  join account a on h.p = a.p
  join manager m on a.aid=m.id
  group by symbol, last_name
)
SELECT Symbol,
       SUM(OutShares) OutShares,
       STUFF(
              (
                SELECT ' '+ Last_Name
                FROM CTE TT
                WHERE TT.Symbol = T.Symbol
                FOR XML PATH('')
              ), 1, 1, ''
       ) last_name
FROM CTE
GROUP BY Symbol;
0 голосов
/ 31 октября 2018

вы можете использовать cte ниже

with cte as
(
select symbol, sum(qty) * cast(Shares as decimal) As OutShares, last_name
from holding h
join security s on h.id=s.id
join account a on h.p = a.p
join manager m on a.aid=m.id
group by symbol, last_name
) select * from cte where OutShares>5

Но из твоего желаемого результата мне кажется, тебе нужно STRING_AGG(), если это sql server 2017

with cte as
    (
    select symbol, sum(qty) * cast(Shares as decimal) As OutShares, last_name
    from holding h
    join security s on h.id=s.id
    join account a on h.p = a.p
    join manager m on a.aid=m.id
    group by symbol, last_name
    ) select symbol,sum(OutShares),
      STRING_AGG(last_name, ', ') as last_name from cte
      group by symbol 

ниже версии сервера sql

with cte as
        (
        select symbol, sum(qty) * cast(Shares as decimal) As OutShares, last_name
        from holding h
        join security s on h.id=s.id
        join account a on h.p = a.p
        join manager m on a.aid=m.id
        group by symbol, last_name
        )

select symbol, sum(OutShares),
  STUFF((SELECT distinct ',' + t2.last_name
         from cte t2
         where t1.symbol= t2.symbol
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,0,'') name
from cte t1 group by symbol
...