Вывод 2 запросов в одну таблицу (в виде дополнительных столбцов) - PullRequest
1 голос
/ 13 октября 2011

У меня есть 2 отдельных запроса, которые я хотел бы объединить, чтобы результаты обоих запросов были выведены в 1 таблицу

Из 2 нижеприведенных запросов мне нужна одна таблица со следующими столбцами: StaffId, FullName, DayCount, MonthCount.

Как лучше всего это сделать?

SELECT TOP (10) COUNT(*) AS MonthCount, Staff.FirstName + Staff.LastName AS FullName, Staff.StaffID
FROM Sales INNER JOIN
    Staff ON Sales.StaffID = Staff.StaffID LEFT OUTER JOIN
    SaleEndorsements ON Sales.SaleID = SaleEndorsements.SaleID
WHERE Sales.CreationDate BETWEEN DATEADD(mm, DATEDIFF(mm,'',getdate()), '') AND getdate() AND SaleEndorsements.EndorsementID = 31
GROUP BY Staff.FirstName, Staff.LastName, Staff.StaffID
ORDER BY MonthCount DESC

SELECT TOP (10) COUNT(*) AS DayCount, Staff.FirstName + Staff.LastName AS FullName, Staff.StaffID
FROM Sales INNER JOIN
    Staff ON Sales.StaffID = Staff.StaffID LEFT OUTER JOIN
    SaleEndorsements ON Sales.SaleID = SaleEndorsements.SaleID
WHERE Sales.CreationDate BETWEEN DATEADD(DD, DATEDIFF(DD,'',getdate()), '') AND getdate() AND SaleEndorsements.EndorsementID = 31
GROUP BY Staff.FirstName, Staff.LastName, Staff.StaffID
ORDER BY DayCount DESC

Ответы [ 3 ]

1 голос
/ 13 октября 2011

Не проверено и поэтому может быть пронизано синтаксическими ошибками, но я думаю, вам нужно сделать что-то вроде

  1. Вставить повторяющиеся функции в базовый CTE
  2. Создать еще один CTE с месяцемколичество ссылок (1)
  3. Создайте еще одно CTE с указанием количества дней (1)
  4. Полное внешнее соединение (2) и (3)

Дополнительно ваш *Предложение 1013 * делает LEFT JOIN бессмысленным, поэтому я изменил его на INNER JOIN.

WITH T
     AS (SELECT Staff.FirstName,
                Staff.LastName,
                Staff.StaffID,
                Sales.CreationDate
         FROM   Sales
                INNER JOIN Staff
                  ON Sales.StaffID = Staff.StaffID
                INNER JOIN SaleEndorsements
                  ON Sales.SaleID = SaleEndorsements.SaleID
         WHERE  SaleEndorsements.EndorsementID = 31),
     D
     AS (SELECT TOP (10) COUNT(*)             AS DayCount,
                         FirstName + LastName AS FullName,
                         StaffID
         FROM   T
         WHERE  CreationDate BETWEEN DATEADD(DD, DATEDIFF(DD, '', getdate()), '') AND
                                     getdate()
         GROUP  BY FirstName,
                   LastName,
                   StaffID
         ORDER  BY DayCount DESC),
     M
     AS (SELECT TOP (10) COUNT(*)             AS MonthCount,
                         FirstName + LastName AS FullName,
         FROM   T
         WHERE  CreationDate BETWEEN DATEADD(mm, DATEDIFF(mm, '', getdate()), '') AND
                                     getdate()
         GROUP  BY FirstName,
                   LastName,
                   StaffID
         ORDER  BY MonthCount DESC)
SELECT ISNULL(M.StaffId, D.StaffId)   AS StaffId,
       ISNULL(M.FullName, D.FullName) AS FullName,
       M.MonthCount,
       D.DayCount
FROM   M
       FULL OUTER JOIN D
         ON M.StaffID = D.StaffID  
0 голосов
/ 13 октября 2011

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

CREATE PROCEDURE [dbo].[GetStats]
AS

SELECT TOP (10) Staff.StaffID, Staff.FirstName + Staff.LastName AS FullName, COUNT(*) AS MonthCount, 0 As DayCount
INTO #TempMonthlyStats
FROM Sales INNER JOIN
    Staff ON Sales.StaffID = Staff.StaffID LEFT OUTER JOIN
    SaleEndorsements ON Sales.SaleID = SaleEndorsements.SaleID
WHERE Sales.CreationDate BETWEEN DATEADD(mm, DATEDIFF(mm,'',getdate()), '') AND getdate() AND SaleEndorsements.EndorsementID = 31
GROUP BY Staff.FirstName, Staff.LastName, Staff.StaffID
ORDER BY MonthCount DESC

SELECT TOP (10) Staff.StaffID, Staff.FirstName + Staff.LastName AS FullName, 0 AS MonthCount, COUNT(*) As DayCount
INTO #TempDailyStats
FROM Sales INNER JOIN
    Staff ON Sales.StaffID = Staff.StaffID LEFT OUTER JOIN
    SaleEndorsements ON Sales.SaleID = SaleEndorsements.SaleID
WHERE Sales.CreationDate BETWEEN DATEADD(DD, DATEDIFF(DD,'',getdate()), '') AND getdate() AND SaleEndorsements.EndorsementID = 31
GROUP BY Staff.FirstName, Staff.LastName, Staff.StaffID
ORDER BY MonthCount DESC


SELECT #TempMonthlyStats.StaffID, #TempMonthlyStats.FullName, #TempMonthlyStats.MonthCount, COALESCE(#TempDailyStats.DayCount,0) AS DayCount
FROM #TempMonthlyStats
LEFT OUTER JOIN #TempDailyStats
ON #TempMonthlyStats.StaffID = #TempDailyStats.StaffID
ORDER BY MonthCount DESC
0 голосов
/ 13 октября 2011

Добавьте к этому предложение UNION ALL, например:

SELECT TOP (10) COUNT(*) AS MonthCount, Staff.FirstName + Staff.LastName AS FullName, Staff.StaffID FROM Sales INNER JOIN     Staff ON Sales.StaffID = Staff.StaffID LEFT OUTER JOIN     SaleEndorsements ON Sales.SaleID = SaleEndorsements.SaleID WHERE Sales.CreationDate BETWEEN DATEADD(mm, DATEDIFF(mm,'',getdate()), '') AND getdate() AND SaleEndorsements.EndorsementID = 31 GROUP BY Staff.FirstName, Staff.LastName, Staff.StaffID ORDER BY MonthCount DESC  
union all
SELECT TOP (10) COUNT(*) AS DayCount, Staff.FirstName + Staff.LastName AS FullName, Staff.StaffID FROM Sales INNER JOIN     Staff ON Sales.StaffID = Staff.StaffID LEFT OUTER JOIN     SaleEndorsements ON Sales.SaleID = SaleEndorsements.SaleID WHERE Sales.CreationDate BETWEEN DATEADD(DD, DATEDIFF(DD,'',getdate()), '') AND getdate() AND SaleEndorsements.EndorsementID = 31 GROUP BY Staff.FirstName, Staff.LastName, Staff.StaffID ORDER BY DayCount DESC 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...