将2个查询输出到一个表中(作为额外列)

时间:2011-10-13 14:08:28

标签: tsql

我有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 个答案:

答案 0 :(得分:1)

未经测试,因此可能会出现语法错误,但我认为您需要执行类似

的操作
  1. 将重复的功能推入基础CTE
  2. 使用月份计数引用(1)
  3. 创建另一个CTE
  4. 使用日期计数引用(1)
  5. 创建另一个CTE
  6. Full Outer Join(2)和(3)
  7. 此外,您的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  
    

答案 1 :(得分: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 

答案 2 :(得分: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