МАКСИМАЛЬНЫЕ СУММЫ ГРУППЫ BY JOIN - PullRequest
0 голосов
/ 10 октября 2018

Я застрял.

У меня есть две таблицы:

Первая, [PurchasedItemsByCustomer] со столбцами:

[CustID] INT NULL,
[ItemId] INT NULL,
[Quantity] INT NULL,
[OnDate] DATE NULL

Вторая, таблица [Items] сстолбцы:

[ItemId] INT NULL,
[Price] FLOAT NULL,
[CategoryId] INT NULL

Мне нужно вывести список из 3 столбцов:

  • в месяц
  • категория, которая продалась больше всего (в количестве предметов)в этом месяце
  • сколько предметов из этой категории было приобретено в этом месяце.

Спасибо

Ответы [ 3 ]

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

Вот, пожалуйста,

SELECT
            A.[CategoryId],
            A.[Month],
            A.[CategoryMonthCount]
    FROM
            (
            SELECT
                        A.[CategoryId],
                        A.[Month],
                        A.[CategoryMonthCount],
                        RANK() OVER(
                            PARTITION BY A.[Month] 
                            ORDER BY A.[CategoryMonthCount] DESC) [RN]
                FROM
                        (
                        SELECT
                                    I.[CategoryId],
                                    MONTH(PIBC.[OnDate]) [Month],
                                    SUM(PIBC.[Quantity]) [CategoryMonthCount]
                            FROM
                                    [dbo].[PurchasedItemsByCustomer] PIBC
                                JOIN
                                    [dbo].[Items] I
                                GROUP BY
                                    I.[CategoryId],
                                    MONTH(PIBC.[OnDate])
                        ) A
            ) A
    WHERE
            A.[RN] = 1;
0 голосов
/ 10 октября 2018

Divide et Impera:

with dept_sales as(
select month(ondate) as month, year(ondate) as year, category, count(*) as N -- measure sales for each month and category
from purchase join items using itemid
group by year(ondate), month(ondate), category)

select top 1 * --pick the highest
from dept_sales
where year = year(current_timestamp) -- I imagine you need data only for current year
order by N desc --order by N asc if you want the least selling category

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

Я использовал CTE для ясности кода, чтобы разделить фазы вычислений, вы можете вкладывать их, если хотите.

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

Я думаю, вы можете использовать такой запрос:

;With SoldPerMonth as (
    select datepart(month, p.onDate) [Month], i.CategoryId [Category], sum(p.Quntity) [Count]
    from PurchasedItemsByCustomer p
    join Items i on p.ItemId = i.ItemId
    group by datepart(month, p.onDate), i.CategoryId
), SoldPerMonthRanked as (
    select *, rank() over (partition by [Month] order by [Count] desc) rnk
    from SoldPerMonth
)
select [Month], [Category], [Count]
from SoldPerMonthRanked
where rnk = 1;

Демонстрация SQL Server

Примечание: вышезапрос с использованием rank() предоставит все максимальные категории, если вы хотите вернуть только одну строку, используйте row_number().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...