2011-10-13 30 views
1

我有2個單獨的查詢,我想下面我想從2個查詢,以便結合,對於這兩個查詢的結果被輸出到1個表1.4.3 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 

回答

0

添加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 
+0

這是行不通的。他們將需要在派生表或CTE –

+0

嗨衝浪,這並不工作,並在任何情況下,我不認爲這會導致列DayCountand MonthCount – BrightonDev

+0

馬丁,是的,我很確定我需要使用子查詢或者創建一個臨時表,然後查詢該臨時表 – BrightonDev

1

未經測試,所以可能有語法錯誤百出,但我認爲你需要做的是這樣

  1. 推將基準CTE的重複功能編入基準CTE中
  2. 創建另一個CTE,與天數引用(1)
  3. 全外連接創建另一個CTE(2)和(3)

另外您WHERE條款使得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

如果你可以使用一個存儲過程,這將是這樣做的一種方式:

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