Суммировать по неделям, даже для пустых строк - PullRequest
2 голосов
/ 17 января 2012

Я хочу суммировать сумму sales.quantity по неделям и показывать номер недели, даже если продаж нет.

Я настроил таблицу недель с 1-54, чтобы использоватьВнешнее соединение, чтобы заставить номера всех недель проходить, но это не работает.Пропускают недели, когда не было продаж.

Мой запрос:

SELECT Weeks.WeekNum, SUM(sales.quantity) AS sales
FROM Weeks LEFT OUTER JOIN 
     sales ON Weeks.WeekNum = DATEPART(week, sales.transDate)
WHERE (sales.transDate BETWEEN @fromDate AND @toDate)
GROUP BY Weeks.WeekNum

ЛЮБАЯ помощь будет принята очень ... это, наверное, глупость, которую я сделал!

Ответы [ 4 ]

2 голосов
/ 17 января 2012

Пункт where WHERE (sales.transDate BETWEEN @fromDate AND @toDate) удалит любые недели без продаж. Скорее всего, вам понадобится выполнить подзапрос, чтобы получить транзакции, а затем присоединить его к своей таблице недель.

SELECT Weeks.WeekNum, SUM(sales.quantity) AS sales
FROM Weeks LEFT OUTER JOIN 
 (
    SELECT *
    FROM sales 
    WHERE (sales.transDate BETWEEN @fromDate AND @toDate)
 ) sales
    ON Weeks.WeekNum = DATEPART(week, sales.transDate)
GROUP BY Weeks.WeekNum
1 голос
/ 17 января 2012

Попробуйте это:

SELECT Weeks.WeekNum, SUM(sales.quantity) AS sales
FROM Weeks 
LEFT JOIN sales 
       ON Weeks.WeekNum = DATEPART(week, sales.transDate) and
          sales.transDate BETWEEN @fromDate AND @toDate
WHERE Weeks.WeekNum BETWEEN DATEPART(week, @fromDate) AND 
                            DATEPART(week, @toDate)
GROUP BY Weeks.WeekNum
1 голос
/ 17 января 2012

Как писал @ msmucker0527 избавиться от WHERE (sales.transDate BETWEEN @fromDate AND @toDate).Вы также можете сделать это следующим образом:

SELECT Weeks.WeekNum, SUM(sales.quantity) AS sales
FROM Weeks W  
     LEFT JOIN sales S ON W.WeekNum = DATEPART(week, S.transDate)
            AND S.transDate BETWEEN @fromDate AND @toDate)
GROUP BY W.WeekNum

Кроме того, эта WHERE (sales.transDate BETWEEN @fromDate AND @toDate) гарантирует таблицу Index Scan из Sales, которая может значительно замедлить ваш запрос.
Вам лучше включить столбцыWeekFirstDate datetime и WeekLastDate datetime в Weeks таблицу и CREATE NONCLUSTERED INDEX IX_Name ON Sales (TransDate) INCLUDE (quantity).В этом случае ваш запрос можно изменить следующим образом:

SELECT Weeks.WeekNum, SUM(sales.quantity) AS sales
FROM Weeks W  
     LEFT JOIN sales S ON S.transDate>=W.WeekFirstDate
                          AND S.transDate<=W.WeekLastDate
                          AND S.transDate BETWEEN @fromDate AND @toDate)
GROUP BY W.WeekNum
1 голос
/ 17 января 2012

Я предпочитаю этот метод, а не вспомогательный

SELECT Weeks.WeekNum, SUM(sales.quantity) AS sales
FROM Weeks
LEFT OUTER JOIN  sales ON (Weeks.WeekNum = DATEPART(week, sales.transDate) AND sales.transDate BETWEEN @fromDate AND @toDate)
GROUP BY Weeks.WeekNum
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...