Сводка в SQL без агрегатной функции - PullRequest
0 голосов
/ 09 октября 2018

У меня есть сценарий, где у меня есть таблица, подобная

Представление таблицы

и что я хочу получить

Ответы [ 3 ]

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

Если ваш аргумент - «У меня будет только одно значение или нет значений, поэтому я не хочу агрегировать», то поймите, что есть несколько агрегатов, которые, если им передано только одно значение для агрегации, будутвернуть это значение обратно как их результат.MIN и MAX приходят на ум.SUM также работает для числовых данных.

Поэтому решение для указания PIVOT без агрегата состоит в том, чтобы вместо этого указать здесь такой «проходной» агрегат.

По существу, PIVOT внутренне работает так же, как GROUP BY.За исключением столбцов группировки все столбцы в текущем наборе результатов , кроме столбец, упомянутый в агрегатной части спецификации PIVOT.И так же, как с правилами для предложения SELECT, когда используется GROUP BY 1 , каждый столбец либо должен быть столбцом группировки или содержаться в совокупности.


1 ворчать, ворчать, старше ворчать.Хотя значения по умолчанию более разумны, начиная с 5.7.5 и выше.

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

Вы можете «повернуть» такие данные, используя join s:

select p.productname,
       t_win32.grade as win32,
       t_universal.grade as universal,
       . . .
from products p left join -- assume you have such a table
     t t_win32
     on t_win32.product_name = p.productname and t_win32.platform = 'Win32' left join
     t t_universal
     on t_universal.product_name = p.productname and t_universal.platform = 'Universal'  left join
     . . . 

Если у вас нет таблицы products, используйте вместо нее производную таблицу:

from (select distinct product_name from t) p left join
     . . .
0 голосов
/ 09 октября 2018

Попробуйте:

Демо

with cte1 as
(
select 'Web' as platformname,'abc' as productname,'A' as grade
union all
select 'Web' ,'cde' ,'B'
union all
select 'IOS' ,'xyz' ,'C'
union all
select 'MAX' ,'cde' ,'D'
)
select  productname,[Web], [IOS], [Android],[Universal],[Mac],[Win32]
from    cte1 t
        pivot
        (
            max(grade)
            for platformname in ([Web], [IOS], [Android],[Universal],[Mac],[Win32])
        ) p
...