0

我对自己的工作有点困惑,我似乎把我的问题复杂化了。

我正在从呼叫拨号器中提取数据,该拨号器记录所有座席的所有呼叫,并且每个座席都在一个队列中,同一个队列中可以有多个座席。

我在 SQL 中的基本计算可以提取日期、队列、小时数和每小时的呼叫次数,如下所示:

callDate    queueid    cHour    numberOfCalls
2013-05-03  No Queue     0            1
2013-05-03  No Queue     2            1
2013-05-03  No Queue     6            1
2013-05-03  No Queue     7            7
2013-05-03  No Queue     8            6
2013-05-03  No Queue     9            14
2013-05-03  No Queue     10           6
2013-05-03  No Queue     11           5
2013-05-03  No Queue     12           8
2013-05-03  17001        7            114
2013-05-03  17001        8            238
2013-05-03  17001        9            227
2013-05-03  17001        10           190
2013-05-03  17001        11           221
2013-05-03  17001        12           73
2013-05-03  17002        6            3
2013-05-03  17002        7            125 

在那里您可以看到队列、小时以及该小时的呼叫次数(小时为上午 7 点、上午 8 点......等)。

我需要知道我是否创建了一个多维数组来存储队列、每个队列的小时数和呼叫次数、每个小时(如果这有意义吗?),以便我以后可以将其用作图表?

这是我坚持使用的示例代码:

xml:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:DV="clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit"
    xmlns:DVC="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"
    xmlns:ThemeManager.ThemeName="MetropolisDark"
    Title="MainWindow" Height="350" Width="525">
<Grid>

    <DVC:Chart Name="Chart"
               Background="#463F3F">                
        <DVC:Chart.PlotAreaStyle>
            <Style TargetType="Grid">
                <Setter Property="Background" Value="Transparent" />
            </Style>
        </DVC:Chart.PlotAreaStyle>
    </DVC:Chart>

</Grid>

C#:

    private void AllAgentHourData()
    {
        string[] queueid = new string[100];
        int[] callHour = new int[100];
        int count = 0;
        int counter = 0;

        SqlConnection sqlConnection1 = new SqlConnection("Server=nl-reportserver;Database=RC_Dailer_WH;User Id=sa;Password=d@t0r@.001");
        SqlCommand cmd = new SqlCommand();
        SqlDataReader reader;

        //cmd.CommandText = "SELECT * FROM RC_call_logs WHERE convert(date,call_logdate,120) = convert(date,GETDATE(),120)";
        cmd.CommandText = "Select distinct queueid from RC_call_logs order by queueid";
        cmd.CommandType = CommandType.Text;
        cmd.Connection = sqlConnection1;

        sqlConnection1.Open();

        reader = cmd.ExecuteReader();
        if (reader.HasRows)
        {
            while (reader.Read())
            {
                queueid[count] = reader.GetString(0);
            }
        }
        else
        {
            MessageBox.Show("No Error message");
        }
        reader.Close();

        sqlConnection1.Close();

        Random random = new Random();

        //Chart is your chart object in Xaml
        //declare your series
        for (int i = 1; i < 10; i++)
        {
            LineSeries ls = new LineSeries();

            ls.Title = i.ToString();
            ls.IndependentValueBinding = new Binding("Key");
            ls.DependentValueBinding = new Binding("Value");

            ls.ItemsSource = new KeyValuePair<DateTime, int>[]{
            new KeyValuePair<DateTime,int>(DateTime.Now             , random.Next(1000)),
            new KeyValuePair<DateTime,int>(DateTime.Now.AddMonths(1), random.Next(10, 1000)),
            new KeyValuePair<DateTime,int>(DateTime.Now.AddMonths(2), random.Next(10, 1000)),
            new KeyValuePair<DateTime,int>(DateTime.Now.AddMonths(3), random.Next(10, 1000)),
            new KeyValuePair<DateTime,int>(DateTime.Now.AddMonths(4), random.Next(10, 1000))};

            // then add it to the chart
            Chart.Series.Add(ls);
        }

    }
4

2 回答 2

1

我不太确定你想要达到什么目标,但这样的事情可能会有所帮助。

Dictionary<DateTime, Dictionary<string, KeyValuePair<int,int>>> dicData

DateTime 是你的 DateTime,string 是你的 Queue 和 int,KeyValuePair 中的 int 是小时和 numberOfCall 对。

编辑1:

实际上它必须是 KeyValuePair 的列表。这是一个例子:

Dictionary<DateTime, Dictionary<string, List<KeyValuePair<int, int>>>> dicData = new Dictionary<DateTime, Dictionary<string, List<KeyValuePair<int, int>>>>();
        //dt is your result from SQL query
        foreach (DataRow dr in dt.Rows)
        {
            DateTime dtm = DateTime.Parse(dr["DateTime"].ToString());
            string queue = dr["Queue"].ToString();
            int hours = int.Parse(dr["Hours"].ToString());
            int cycles = int.Parse(dr["Cycles"].ToString());

            //Adding Distinct DateTime objects as Key
            if(!dicData.ContainsKey(dtm))
            {
                dicData[dtm] = new Dictionary<string, KeyValuePair<int, int>>();
            }

            //Adding distinct Queue object as Key under the DateTime dictionary
            if (!dicData.ContainsKey(queue))
            {
                dicData[dtm][queue] = new List<KeyValuePair<int, int>>();
            }
            dicData[dtm][queue].Add(new KeyValuePair<int, int>(hours, cycles));
        }
于 2013-05-03T12:28:56.137 回答
0

编辑

所以,在你的阅读 while 循环中,你可以这样做,

while (reader.Read())
{
    var callHour = new CallHour(
        DateTime.ParseExact("yyyy-mm-dd", reader.GetString(0)),
        reader.GetInt32(2),
        reader.GetInt32(3),
        reader.IsDBNull(1) ? null : reader.GetInt32(1));

    callHours.Add(callHour.Time, callHour);
}

创建一个类,你可以调用它,CallHour然后你可以拥有一些通用的CallHour. 该通用集合将支持IEnumerable<CallHour>并且可能IList<CallHour>


public class CallHour
{
     private readonly DateTime time;

     public CallHour(
            DateTime day,
            int hour,
            int callCount,
            int? queueId = null)
     {
         this.hour = new DateTime(
             day.Year,
             day.Month,
             day.Day,
             hour,
             0,
             0,
             0);

         this.CallCount = callCount;
         this.QueueId = queueId;
     }

     public DateTime Time
     {
         get
         {
             return this.time;
         }
     }

     public int? QueueId { get; set; }
     public int CallCount { get; set; }
}    

然后你可以声明一个排序列表,并添加你的第一个小时。

var callHours = new SortedList<DateTime, CallHour>();

var someCallHour = new CallHour(
    DateTime.Parse("2013-05-03 00:00:00"), 0, 1);

callHours.Add(someCallHour.Time, someCallHour);
于 2013-05-03T12:33:16.110 回答