private PivotValue CalculateSummary(PivotValue pv, double val)
 {
     pv.Count++;
     pv.Sum    += val;
     pv.Average = pv.Sum / pv.Count;
     pv.Max     = pv.Max > val ? pv.Max : val;
     pv.Min     = pv.Min < val ? pv.Min : val;
     return(pv);
 }
        public double GetCellData(PivotValue pv, PivotGroupFunction grpFn)
        {
            switch (grpFn)
            {
            case PivotGroupFunction.Count:
                return(pv.Count);

            case PivotGroupFunction.Sum:
                return(pv.Sum);

            case PivotGroupFunction.Max:
                return(pv.Max);

            case PivotGroupFunction.Min:
                return(pv.Min);

            case PivotGroupFunction.Average:
            case PivotGroupFunction.None:
            default:
                return(pv.Average);
            }
        }
        public List <DynamicDictionary> PivotTheData(List <DynamicDictionary> sourceData)
        {
            DynamicDictionary disc = sourceData[0];
            string            mov  = disc.GetValueAsString("mov").ToUpper().Trim();

            try
            {
                SummaryOfData.Clear();
                //manage or prepare distict of the values
                double val = 0;
                string valx = string.Empty, valy = string.Empty;
                for (int i = 0, len = sourceData.Count; i < len; i++)
                {
                    valx = sourceData[i].GetValueAsString(ColumnX.Name1);
                    valy = sourceData[i].GetValueAsString(ColumnY.Name2) + sourceData[i].GetValueAsString(ColumnY.Name1);
                    val  = sourceData[i].GetValue <Double>(ColumnValue);

                    PivotData pd = GetPivotData(valx, valy);
                    pd.Value = CalculateSummary(pd.Value, val);
                }
                List <DynamicDictionary> dt = FinalPivotDictionary;
                double tot = 0;
                //now put the data in DataTable
                foreach (string y in yKeys)
                {
                    if (y.Trim().Length == 0)
                    {
                        continue;
                    }
                    IEnumerable <PivotData> yRows = SummaryOfData.Where(d => d.ValueY == y);
                    DynamicDictionary       dr    = new DynamicDictionary();
                    //prepare the row/record
                    dr[ColumnY.Name1] = y;
                    PivotValue pv_y = SummaryOfY[y];
                    foreach (PivotData pd in yRows)
                    {
                        val           = GetCellData(pd.Value, ColumnY.SummaryGroupFunction);
                        dr[pd.ValueX] = val;
                        //calculate summary of Y
                        pv_y = CalculateSummary(pv_y, val);
                    }
                    foreach (string x in xKeys)
                    {
                        if (!dr.ContainsKey(x))
                        {
                            dr[x] = string.Empty;
                        }
                    }
                    tot = GetCellData(pv_y, ColumnY.SummaryGroupFunction);
                    dr[ColumnY.SummaryLabel] = tot;
                    //
                    dt.Add(dr);
                    //also calculating the grand total
                    GrandTotal += tot;

                    //Calculate total for arr and dep
                    if (mov == "DEP")
                    {
                        DepTotal = GrandTotal;
                    }
                    else
                    {
                        ArrTotal = GrandTotal - DepTotal;
                    }
                }
                DepTotal = GrandTotal;
                //calculate the summary of X
                if (ColumnY.CalculateSummary)
                {
                    DynamicDictionary dr = new DynamicDictionary();
                    dr[ColumnY.Name1] = ColumnX.SummaryLabel;
                    foreach (string x in xKeys)
                    {
                        IEnumerable <PivotData> xRows = SummaryOfData.Where(d => d.ValueX == x);
                        PivotValue pv_x = SummaryOfX[x];
                        foreach (PivotData pd in xRows)
                        {
                            pv_x = CalculateSummary(pv_x, GetCellData(pd.Value, ColumnX.SummaryGroupFunction));
                        }
                        dr[x] = GetCellData(pv_x, ColumnX.SummaryGroupFunction);
                    }
                    if (ColumnX.CalculateSummary)
                    {
                        dr[ColumnX.SummaryLabel] = mov == "ARR" ? ArrTotal : DepTotal;
                    }
                    dt.Add(dr);
                }
                return(dt);
            }
            catch (Exception ex)
            {
            }
            return(null);
        }
        public DataTable PivotTheData(DataTable sourceData)
        {
            try
            {
                //manage or prepare distict of the values
                double val = 0;
                string valx = string.Empty, valy = string.Empty;
                SummaryOfData.Clear();
                for (int i = 0, len = sourceData.Rows.Count; i < len; i++)
                {
                    valx = GetStringValue(sourceData.Rows[i], ColumnX.Name1, ColumnY.Name2);
                    valy = GetStringValue(sourceData.Rows[i], ColumnY.Name1, ColumnY.Name2);
                    val  = GetDoubleValue(sourceData.Rows[i], ColumnValue);

                    PivotData pd = GetPivotData(valx, valy);
                    pd.Value = CalculateSummary(pd.Value, val);
                }
                DataTable dt  = FinalPivotDataTable;
                double    tot = 0;
                //now put the data in DataTable
                foreach (string y in yKeys)
                {
                    if (y.Trim().Length == 0)
                    {
                        continue;
                    }
                    IEnumerable <PivotData> yRows = SummaryOfData.Where(d => d.ValueY == y);
                    DataRow dr = dt.NewRow();
                    dr[ColumnY.Name1] = y;
                    PivotValue pv_y = SummaryOfY[y];
                    foreach (PivotData pd in yRows)
                    {
                        val           = GetCellData(pd.Value, ValueGroupFunction);
                        dr[pd.ValueX] = val;
                        //calculate summary of Y
                        pv_y = CalculateSummary(pv_y, val);
                    }
                    tot = GetCellData(pv_y, ColumnY.SummaryGroupFunction);
                    dr[ColumnY.SummaryLabel] = tot;
                    dt.Rows.Add(dr);
                    //also calculating the grand total
                    GrandTotal += tot;
                }
                //calculate the summary of X
                if (ColumnY.CalculateSummary)
                {
                    DataRow dr = dt.NewRow();
                    dr[ColumnY.Name1] = ColumnX.SummaryLabel;
                    foreach (string x in xKeys)
                    {
                        IEnumerable <PivotData> xRows = SummaryOfData.Where(d => d.ValueX == x);
                        PivotValue pv_x = SummaryOfX[x];
                        foreach (PivotData pd in xRows)
                        {
                            pv_x = CalculateSummary(pv_x, GetCellData(pd.Value, ValueGroupFunction));
                        }
                        dr[x] = GetCellData(pv_x, ColumnX.SummaryGroupFunction);
                    }
                    if (dt.Columns.Contains(ColumnX.SummaryLabel))
                    {
                        dr[ColumnX.SummaryLabel] = GrandTotal;
                    }
                    dt.Rows.Add(dr);
                }

                return(dt);
            }
            catch (Exception ex)
            {
            }
            return(null);
        }