0

VS2010に同梱されているMicrosoftChart拡張機能を使用しています。これは私のニーズによく合っていますが、煩わしさを感じ、よりエレガントなソリューションを探しています。

折れ線グラフを作成する場合、連続した線を作成するには、すべてのX座標のデータが必要です。私のデータセットは、月ごとの従業員の売上数に関するもので、売上数はYで、月はXです。X値のデータが返されない場合(つまり、従業員が1か月休んだ場合)に問題が発生します。線は連続していません。

チャートコントロールで見落とした設定があるかどうかはわかりませんが、私の洗練されていない解決策は、従業員が売り上げを投稿しなかった月の「偽の」ゼロ売り上げデータを作成することです。

MS SQLのストアドプロシージャを使用してデータセットを作成しています。各列は月で、各行は従業員用です。次に、各従業員のチャートコントロールに新しいシリーズを作成します。

売上ゼロの月をキャプチャするために、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) 

私の「偽の」ゼロ販売データを取得するため。

これは機能します...しかし、FEELSは私には本当に不器用です...私は自分の目的により適した単純なものを見落としていると感じずにはいられません。繰り返しになりますが、私はこれを機能させています…しかし、常に物事を行うためのより良い方法を探し、知識ベースを拡大しています…。したがって、誰かが上記を達成するためのより良い方法の提案を持っているなら、私はいくつかの提案やフィードバックが大好きです。

4

1 に答える 1

0

tblMonth.DefaultCount が常に 0 である場合、次の理由はありません。

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 の代わりに、ユーティリティ/リソース データベースの永続テーブルを使用します。1 日の 1 分ごとのレコード、この場合は 1 年間の毎月のレコードなど、既にデータが取り込まれています。これらのタイプのテーブルは、それらが何と呼ばれているか忘れてしまいました - おそらくファクトテーブルの形式ですか? データのギャップを探したり埋めたりするときに非常に便利です。

于 2010-07-02T03:36:54.120 に答える