0

我正在使用 VS 2010 附带的 Microsoft Chart 扩展。这很适合我的需求,但我遇到了麻烦,正在寻找更优雅的解决方案。

在绘制折线图时,为了实现连续线,我需要所有 X 坐标的数据。我的数据集是按月按员工的销售数量,其中销售计数在 Y 上,月份在 X 上。问题出现在没有为 X 值返回数据的情况下(即员工休假一个月)......所以这条线不是连续的。

我不确定图表控件中是否有我忽略的设置,但我不雅的解决方案是为员工发布没有销售的月份创建“假”零销售数据。

我在 MS SQL 中使用存储过程来创建我的数据集,其中每一列是一个月,每一行是一个员工。然后,我在 Chart 控件中为每个员工创建一个新系列。

为了记录我的零销售月份,我在 SQL 中创建了一个临时表。

CREATE TABLE @tblMonth (myMonth nvarchar(10), defaultCount int)
INSERT INTO @tblMonth VALUES (‘January’, 0)
…
INSERT INTO @tblMonth VALUES (‘December’, 0)

然后我在我的实际数据记录上执行我的临时表的连接并使用

ISNULL (realData.Count, tblMonth.defaultCount) 

获取我的“假”零销售数据。

这行得通……但感觉对我来说真的很笨拙……我不禁觉得我忽略了一些更适合我的目的的简单事情。同样,我已经完成了这项工作......但一直在寻找更好的做事方式并扩展我的知识库......所以如果有人对如何更好地完成上述工作提出建议,我会喜欢一些建议或反馈。

4

1 回答 1

0

如果 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。它已经填充了一天中每一分钟的记录,或者在这种情况下,一年中每个月的记录。这些类型的表,忘了它们叫什么——也许是事实表的一种形式?在查找或填补数据空白时非常有用。

于 2010-07-02T03:36:54.120 回答