我有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
答案 0 :(得分:1)
未经测试,因此可能会出现语法错误,但我认为您需要执行类似
的操作此外,您的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