如果 tblMonth.DefaultCount 将始终为零,那么为什么不呢:
ISNULL (realData.Count, 0)
这就是我猜你的查询的样子:
SELECT
sales_month = DATENAME ( month, s.sale_date )
, sales_month_n = DATEPART( month, s.sale_date)
, salesperson = e.employee_name
, numb_of_sales = COUNT ( 1 )
FROM
sales s
JOIN employee e
ON s.employee_id_salesperson = e.employee_id
WHERE s.sale_date >= '1/1/2010' and s.sale_date < '1/1/2011'
GROUP BY
DATENAME ( month, s.sale_date ), e.employee_name, DATEPART( month, s.sale_date)
——这很好,直到你有一名员工在 6 月、7 月和 8 月离职。您仍然希望它们出现在结果集中,但销售额为零
CREATE TABLE @tblMonth (myMonth nvarchar(10), n tinyint)
INSERT INTO @tblMonth VALUES ('January', 1)
...
INSERT INTO @tblMonth VALUES ('December', 12)
SELECT
all_possibles.sales_month
, all_possibles.salesperson
, ISNULL ( actual.numb_of_sales, 0 )
FROM
(
SELECT
sales_month = myMonth
, sales_month_n = n
, salesperson = e.employee_name
FROM
employee e
,@tblMonth M
)all_possibles
LEFT JOIN
(
SELECT
sales_month_n = DATEPART( month, s.sale_date)
, salesperson = e.employee_name
, numb_of_sales = COUNT ( 1 )
FROM
sales s
JOIN employee e
ON s.employee_id_salesperson = e.employee_id
WHERE s.sale_date >= '1/1/2010' and s.sale_date < '1/1/2011'
GROUP BY
e.employee_name, DATEPART( month, s.sale_date)
)actuals
ON
(
all_possibles.salesperson = actuals.salesperson
AND all_possibles.sales_month_n = actuals.sales_month_n
)
对不起,冗长的回答。希望你感到放心,你是在正确的轨道上。祝你好运!
至于 kludgy - 我在实用程序/资源数据库中使用永久表而不是 @tblMonth。它已经填充了一天中每一分钟的记录,或者在这种情况下,一年中每个月的记录。这些类型的表,忘了它们叫什么——也许是事实表的一种形式?在查找或填补数据空白时非常有用。