为什么下面的饼图只显示了sql计数条件的1/3?

Why is the following pie chart only displaying 1/3 of the sql count condition?

您好,又来打扰大家了。有人可以看看我的代码并纠正我吗?我似乎无法在 image in 3) 中获得我想要的结果。我的图表仅显示 1/3 的计数条件。我如何修改以下行,以便我可以读取所有计数条件以显示 3) 中的图像?

private void BindChart()
{
    string query3 = string.Format("select count(case when tempValue < 24 then 1 end) as Cold, count(case when tempValue between 24 and 30 then 1 end) as Warm, count(case when tempValue > 30 then 1 end) as Hot FROM Datacentre");
    DataTable dt = GetData3(query3);

    string[] x = new string[] { "< 24 Degrees", "24 - 30 Degrees", "> 30 Degrees" };
    foreach (DataRow row in dt.Rows)
    {
        foreach (var value in x)
        {
            PieChart1.PieChartValues.Add(new AjaxControlToolkit.PieChartValue
            {
                Category = value,
                Data = Convert.ToDecimal(row["Cold"]) //reads 3 objects
            });//PROBLEM: but only displays total count of 18 for everything
        }
    }

    this.PieChart1.Enabled = true;
    this.PieChart1.Visible = true;
    this.PieChart1.DataBind();
}

1) 这是我检索到的内容:

2) 这是我的图表输出:

3) 这就是我想要的结果:

您只读了返回结果的冷部分。 SQL returns 只有一行所以你需要阅读每一列,你目前只阅读冷列。

for (var i=0; i < x.Length;i++)
    {
        PieChart1.PieChartValues.Add(new AjaxControlToolkit.PieChartValue
        {
            Category = value,
            Data = Convert.ToDecimal(row[i]) //reads 3 objects
        });//PROBLEM: but only displays total count of 18 for everything
    }

问题是在您的代码中,您硬编码了 "cold":

Data = Convert.ToDecimal(row["Cold"]) //reads 3 objects

而且,您正在遍历不同的行,但您只有一行:

foreach (DataRow row in dt.Rows)

如果您的查询中只有一行 returning,并且只有三个类别,您可以采用不同的方式编写:

data = dt.Rows[0]
PieChart1.PieChartValues.Add(new AjaxControlToolkit.PieChartValue
        {
            Category = "< 24 Degrees",
            Data = Convert.ToDecimal(row["Cold"])
        });
PieChart1.PieChartValues.Add(new AjaxControlToolkit.PieChartValue
        {
            Category = "24 - 30 Degrees",
            Data = Convert.ToDecimal(row["Warm"])
        });
PieChart1.PieChartValues.Add(new AjaxControlToolkit.PieChartValue
        {
            Category = "> 30 Degrees",
            Data = Convert.ToDecimal(row["Hot"])
        });

或者,您可以使用循环,但这假设您的数据集中的三列与数组 x 中的三个元素的顺序相同:

var x = new string[] { "< 24 Degrees", "24 - 30 Degrees", "> 30 Degrees" };
var row = dt.Rows[0]
for(var i=0; i < x.Length;i++)
{
    PieChart1.PieChartValues.Add(new AjaxControlToolkit.PieChartValue
        {
            Category = x[i],
            Data = Convert.ToDecimal(row[i])
        });
    }
}

要真正做到这一点,您可以将您的查询重写为每个数据集的 return 行,并将您的类别和值作为列:

Category       Value
--------------------
< 24 Degrees      18
24 - 30 Degrees   67
> 30 Degrees       2

然后你可以遍历每一行:

foreach (DataRow row in dt.Rows)
{
    PieChart1.PieChartValues.Add(new AjaxControlToolkit.PieChartValue
        {
            Category = row["Category"],
            Data = Convert.ToDecimal(row["Value"])
        });
    }
}

这将需要更复杂的查询(请参阅 here,但是显示饼图的基础代码对于您创建的任何饼图都是通用的。