среда, 20 марта 2013 г.

Как вывести только нужные подитоги (Grouping Sets)

-- Как вывести только нужные подитоги (Grouping Sets)

-- Вычислим максимальные цены для:
-- Сегментов сочетания товарной линейки, ценовой категории (ProductLine, Class)
SELECT
    Productline
    ,Class
    ,MAX(ListPrice) AS MaxListPrice
FROM AdventureWorks2012.Production.Product
WHERE Class IS NOT NULL AND ProductLine IS NOT NULL
GROUP BY ProductLine, Class
    UNION ALL
-- Товарных линеек (ProductLine)
SELECT
    Productline
    ,NULL AS Class
    ,MAX(ListPrice) AS MaxListPrice
FROM AdventureWorks2012.Production.Product
WHERE Class IS NOT NULL AND ProductLine IS NOT NULL
GROUP BY ProductLine
    UNION ALL
-- Ценовых категорий (Class)
SELECT
    NULL AS Productline
    ,Class
    ,MAX(ListPrice) AS MaxListPrice
FROM AdventureWorks2012.Production.Product
WHERE Class IS NOT NULL AND ProductLine IS NOT NULL
GROUP BY Class
--  UNION ALL
-- Всех товаров (Отключено)
--SELECT
--  NULL AS Productline
--  ,NULL AS Class
--  ,MAX(ListPrice) AS MaxListPrice
--FROM AdventureWorks2012.Production.Product
--WHERE Class IS NOT NULL AND ProductLine IS NOT NULL
-- Отсортируем результат
ORDER BY ProductLine, Class;

-- Если SQL Server >= 2008
-- Реализуем через наборы группирования (Grouping Sets)
SELECT
    Productline
    ,Class
    ,MAX(ListPrice) AS MaxListPrice
FROM AdventureWorks2012.Production.Product
WHERE Class IS NOT NULL AND ProductLine IS NOT NULL
GROUP BY GROUPING SETS((ProductLine, Class), (ProductLine),(Class))
ORDER BY ProductLine, Class