1

SQL Server でレポートを作成しようとしています。基本的なテーブル設定は次のとおりです。

注文(ID、DateCreated、ステータス)

商品(ID、名前、価格)

Order_Product_Mapping (OrderID、ProductID、Quantity、Price、DateOrdered)

ここでは、次のような期間の売上高が類似している製品をグループ化するレポートを作成します。

1 か月以上の売り上げ:

  1. コカ、ペプシ、タイガー:平均20000ドル(コカ:21000ドル、ペプシ:19000ドル、タイガー:20000ドル)
  2. パン、肉: 平均 $10000 (パン: $11000、肉: $9000)

() 内のテキストは明確にするためのものであり、レポートには必要ありません)。ユーザーは、類似と見なすことができる販売間の変動を定義します。変動が 5% 未満の例の売上は類似していると見なされ、グループ化する必要があります。期間もユーザー定義です。

ある期間の総売上を計算することはできますが、売上の変動によってそれらをグループ化する方法がわかりません。私は SQL Server 2012 を使用しています。

申し訳ありませんが、私の英語はあまり上手ではありません:)

更新: *私は実際に何が必要かを理解しました ;) *

次のような数値の既知の配列の場合: 1,2,3,50,52,100,102,105

それらを少なくとも 3 つの番号を持つグループにグループ化する必要があり、グループ内の任意の 2 つの項目の差が 10 未満です。

上記の配列の場合、出力は次のようになります。

[1,2,3]

[100,102,105]

=> アルゴリズムは 3 つのパラメーターを取ります: 配列、グループを形成するための最小アイテム、および 2 つのアイテム間の最大差。

これをC#で実装するにはどうすればよいですか?

4

4 に答える 4

1

ところで、C# だけが必要な場合は、次のようにします。

var maxDifference = 10;
var minItems = 3;     

// I just assume your list is not ordered, so order it first
var array = (new List<int> {3, 2, 50, 1, 51, 100, 105, 102}).OrderBy(a => a);

var result = new List<List<int>>();
var group = new List<int>();
var lastNum = array.First();
var totalDiff = 0;
foreach (var n in array)
{
    totalDiff += n - lastNum;

    // if distance of current number and first number in current group
    // is less than the threshold, add into current group
    if (totalDiff <= maxDifference)
    {
        group.Add(n); 
        lastNum = n;
        continue;
    }

    // if current group has 3 items or more, add to final result
    if (group.Count >= minItems)
        result.Add(group);

    // start new group
    group = new List<int>() { n };
    lastNum = n;
    totalDiff = 0;   
}

// forgot the last group...
if (group.Count >= minItems)
    Result.Add(group);

ここで重要なのは、距離を計算するためにジャンプしたり値を保存したりする必要がないように、配列を順序付けする必要があることです。

于 2013-04-12T14:58:02.067 に答える
0

物事を必要以上に複雑にしたように見えます。問題を解決する必要があるのは次のとおりです。

-クエリを実行して、各製品の売上を取得します。

-K-mean または類似のアルゴリズムを実行します。

于 2013-04-09T14:25:08.890 に答える
0

このクエリは、期待どおりの結果を生成するはずです。注文のある月ごとに製品の売上が表示されます。

SELECT CONVERT(CHAR(4), OP.DateOrdered, 100) + CONVERT(CHAR(4), OP.DateOrdered, 120) As Month , 
Product.Name , 
AVG( OP.Quantity * OP.Price ) As Turnover
FROM Order_Product_Mapping OP
INNER JOIN Product ON Product.ID = OP.ProductID
GROUP BY  CONVERT(CHAR(4), OP.DateOrdered, 100) + CONVERT(CHAR(4), OP.DateOrdered, 120) ,
          Product.Name

テストはしていませんが、サンプル データを提供していただければ対応できます

于 2013-04-09T10:50:07.587 に答える