PDA

View Full Version : سوال: نمایش یکستون از دیتابیس در چند ستون دیتا گرید ویو



mahtab.kamali
یک شنبه 15 بهمن 1391, 21:18 عصر
سلام به همه

جدول دیتابیس ما به این شکل است


نام | ماه | نمره

حالا اگه قرار باشه ما نمرات را در یک دیتاگرید ویو که به تعداد ماههای مهر تا خرداد را دارد نمایش دهیم یعنی :

نام | مهر | آبان | ....................

آیا لازم است کوری را در دیتابیس ایجاد کنیم یا اینکه با یک کوری در خود برنامه هم می توان این کار را کرد ؟

reza_Nazem
یک شنبه 15 بهمن 1391, 21:24 عصر
بهترین و سریع ترین راه اینکه از PIVOT در SQL استفاده کنی
اینم یه مثال
http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-unpivot-table-examples/

mahtab.kamali
یک شنبه 15 بهمن 1391, 21:27 عصر
اما من چیزی ازش سر در نیاوردم :گریه:

می شه با یه تکه کد نشون بدین :متفکر:

veniz2008
یک شنبه 15 بهمن 1391, 21:39 عصر
سلام. سوالتون رو بیشتر توضیح بدید تا دوستان راه درست رو پیشنهاد کنن. (منظور از نام چیه؟).

mahtab.kamali
یک شنبه 15 بهمن 1391, 21:48 عصر
ممنونم از تذکرتون

ببینین ما نام دانش آموزان یه کلاس رو در یک ستون ونمراتشون رو در یک ستون

وماه مربوطه رو در یک ستون دیتابیس ( حالا هر نوعی که می خواد باشه ) وارد می کنیم

بعد می خواهیم در دیتا گرید نام دانش آموزان در یک ستون و نمرات آنها به تفکیک ماه نشون بدیم

mahtab.kamali
یک شنبه 15 بهمن 1391, 22:04 عصر
به عنوان مثال این کد برای نشان دادن میانگین یه تعداد اطلاعات از یک ستون رو چگونه می توانیم تغییر دهیم تا چیزی که می خواهیم به دست بیاد



static void Main(string[] args)

{

string cs = @"Data Source=<your server>;Initial Catalog=<your database>;Integrated Security=SSPI";

try

{

using (SqlConnection con = new SqlConnection(cs))

{

con.Open();



string sql = "select * from DailyIncome pivot (avg (IncomeAmount) for IncomeDay in ([MON],[TUE],[WED],[THU],[FRI],[SAT],[SUN])) as AvgIncomePerDay";

SqlDataAdapter da = new SqlDataAdapter(sql, con);

DataTable dt = new DataTable("AverageIncomeForVendor");

da.Fill(dt);



// Bind the DataTable to whatever, just displaying it in console here.



int colCount = dt.Columns.Count;

foreach (DataRow row in dt.Rows)

{

StringBuilder sb = new StringBuilder();

for (int i = 0; i < colCount; i++)

{

sb.Append(row[i].ToString() + "\t");

}

Console.WriteLine(sb.ToString());

}

con.Close();

}

}

catch (Exception ex)

{

Console.WriteLine(ex);

}

veniz2008
یک شنبه 15 بهمن 1391, 22:22 عصر
دستور order by رو جستجو کنید . کار این دستور اینه که رکوردها رو براساس معیار خاص ( مثلا نام ماه) مرتب میکنه.

select name,mah,nomre from tblnomre order by mah

mahtab.kamali
یک شنبه 15 بهمن 1391, 22:27 عصر
دستور order by رو جستجو کنید . کار این دستور اینه که رکوردها رو براساس معیار خاص ( مثلا نام ماه) مرتب میکنه.

select name,mah,nomre from tblnomre order by mah

این دستور واسه مرتب کردنه اطلاعات براساس ماه می باشد نه برای جدا کردن :عصبانی++::گریه:

veniz2008
یک شنبه 15 بهمن 1391, 22:37 عصر
اگر میخواید براساس ماه جدا (دسته بندی) کنید از group by استفاده کنید.
امیدوارم منظورتون رو درست متوجه شده باشم.

mahtab.kamali
یک شنبه 15 بهمن 1391, 22:38 عصر
میشه همینی که گفتین رو با یه تکه کد نشون بدین ؟

veniz2008
یک شنبه 15 بهمن 1391, 22:52 عصر
select studentid,name,mah,nomre from tblnomre group by studentid

mahtab.kamali
یک شنبه 15 بهمن 1391, 22:57 عصر
حالا خروجی این دستور چی می شه ؟

یعنی در دیتا گرید ویو یک ستون نام دانش آموزان و چند ستون از نمرات برای هر ماه به طور مجزا ایجاد می شه ؟؟؟؟؟؟؟؟؟؟

veniz2008
یک شنبه 15 بهمن 1391, 23:19 عصر
حالا خروجی این دستور چی می شه ؟

یعنی در دیتا گرید ویو یک ستون نام دانش آموزان و چند ستون از نمرات برای هر ماه به طور مجزا ایجاد می شه ؟؟؟؟؟؟؟؟؟؟
نه . دستور group by فقط داده ها رو دسته بندی میکنه. یعنی شکل ظاهری همونی هست که درون جدول ذخیره شدن.

mahtab.kamali
یک شنبه 15 بهمن 1391, 23:28 عصر
پس با این حساب راهی نداره دیگه

لطفا یه نفر راهنمایی کنه :گریه:

mahtab.kamali
دوشنبه 16 بهمن 1391, 00:09 صبح
کسی می دونه چطور می شه از این کد استفاده کرد



public static DataTable Pivot(DataTable dataValues, string keyColumn, string pivotNameColumn, string pivotValueColumn)
{
DataTable tmp = new DataTable();
DataRow r;
string LastKey = "//dummy//";
int i, pValIndex, pNameIndex;
string s;
bool FirstRow = true;

pValIndex = dataValues.Columns[pivotValueColumn].Ordinal;
pNameIndex = dataValues.Columns[pivotNameColumn].Ordinal;

for (i = 0; i <= dataValues.Columns.Count - 1; i++)
{
if (i != pValIndex && i != pNameIndex)
tmp.Columns.Add(dataValues.Columns[i].ColumnName, dataValues.Columns[i].DataType);
}

r = tmp.NewRow();

foreach (DataRow row1 in dataValues.Rows)
{
if (row1[keyColumn].ToString() != LastKey)
{
if (!FirstRow)
tmp.Rows.Add(r);

r = tmp.NewRow();
FirstRow = false;

//loop thru fields of row1 and populate tmp table
for (i = 0; i <= row1.ItemArray.Length - 3; i++)
r[i] = row1[tmp.Columns[i].ToString()];

LastKey = row1[keyColumn].ToString();
}

s = row1[pNameIndex].ToString();

if (!tmp.Columns.Contains(s))
tmp.Columns.Add(s, dataValues.Columns[pNameIndex].DataType);
r[s] = row1[pValIndex];
}

//add that final row to the datatable:
tmp.Rows.Add(r);

return tmp;
}

mahtab.kamali
دوشنبه 16 بهمن 1391, 16:29 عصر
سلام

با هزار ویک مصیبت این کد رو واسه PIVOT پیدا کردیم که اون هم این ارور رو می ده




string query = "select userid,[1] as mehr,[2] as aban,[3] as azar,[4] as daey,[5] as bahman,[6] as esfand,[7] as parvardin,[8] as ordiebehesht,[9] as khordad"+
"from"+
"(select userid,[month],score from pivt)"+
"piv pivot(sum(score) for [month] in ( [1],[2],[3],[4],[5],[6],[7],[8],[9])) as chld"+
"order by userid";


علتش چی می تونه باشه ؟؟؟؟؟؟؟؟؟؟؟؟

khokhan
دوشنبه 16 بهمن 1391, 22:06 عصر
با سلام

یه دونه کام بعدازآخرین پارامتر اضافه گذاشتین :قهقهه::قهقهه::قهقهه:

اما اگه اونم بردارین بازم ایراد می گیره می کی نه امتحان کن

khokhan
دوشنبه 16 بهمن 1391, 22:11 عصر
به نظر من با این روش خودتو خسته می کنی چون دیتابیس شما اکسس هست بعیده که ........

به جای اینکه خودتو خسته کنی وندای " هل من ناصر " سر بدی

یه متد با حلقه for تعریف کن وستونهای دیتابیست رو با اون متد سازماندهی کن

حتی می تونی جدولت رو بچرخونی یعنی ستون رو به ردیف و ردیف رو به ستون بدل کنی :لبخند:

اینطوری :


public DataTable PivotTable(DataTable source)
{
DataTable dest = new DataTable("Pivoted" + source.TableName);
dest.Columns.Add(" ");
foreach (DataRow r in source.Rows)
dest.Columns.Add(r[0].ToString());
for (int i = 0; i < source.Columns.Count - 1; i++)
{
dest.Rows.Add(dest.NewRow());
}
for (int r = 0; r < dest.Rows.Count; r++)
{
for (int c = 0; c < dest.Columns.Count; c++)
{
if (c == 0)
dest.Rows[r][0] = source.Columns[r + 1].ColumnName;
else
dest.Rows[r][c] = source.Rows[c - 1][r + 1];
}
}
dest.AcceptChanges();
return dest;
}

khokhan
دوشنبه 16 بهمن 1391, 22:58 عصر
با سلام مجدد

از انجا که ساینتیکس کوری PivotTable ما بین sql و oledb متفاوت می باشد بنابراین شما دستور سلکتتون رو به هر شکلی که

بنویسید ایراد ساینتیکس خواهد گرفت زیرا در jet هنگام تعریف کوئری Pivot ملزم هستید به استفاده از TRANSFORMواین

قسمت از کد همیشه قبل از sum وبعد از پارامتر ها باید نوشته شوددر غیر این صورت با پیغام

Syntax error in FROM clause"

مواجه می شوید

(http://search.yahoo.com/r/_ylt=A0oG7hvUDxBRhz4A2iRXNyoA;_ylu=X3oDMTE1aDYyOGE yBHNlYwNzcgRwb3MDOQRjb2xvA2FjMgR2dGlkA01TWTAxMV8xM jU-/SIG=1312lhl6m/EXP=1360035924/**http%3a//www.mrexcel.com/forum/microsoft-access/350583-syntax-error-clause.html)