ورود

View Full Version : تبدیل جدول از حالت عمودی به افقی



babak2000
شنبه 26 دی 1388, 16:34 عصر
سلام

راستش نمی دونم عنوان تاپیک را درست انتخاب کردم یا نه --- ولی اگه درست نیست مدیران لطفآ درستش کنند

من یه جدول دارم با دو تا ستون به صورت زیر هست

1 110
1 220
1 330


حالا می خواهم جدول را بصورت افقی کنم یعنی یک ردیف با سه تا ستون

1 110 220 330

چه جوری باد این کار را انجام بدم
البته دستور Pivot را دیدم ولی نتوستم ازش استفاده کنم دوستان لطفآ راهنمایی بفرمایید

محمد سلیم آبادی
سه شنبه 29 دی 1388, 12:50 عصر
سلام،
سوالی که از شما دارم این است که آیا این خلاصه شده ی سوال اصلی شماست و سوالی واقعی چیز دیگری است.
چند مقدار (ستون) از هر نمونه را می خواهین نمایش دهین؟ مثلا 10 سطر مقدار 1 دارند و 20 سطر مقدار 2 آیا می خواهین خروجی کوئری شما دارای 20 ستون باشد؟

babak2000
سه شنبه 29 دی 1388, 13:52 عصر
دوست عزیز درست حدس زدید این خلاصه سوال می باشد ببینید ما داخل جدول حداکثر 10 ردیف کد ملی های یکسان داریم

یعنی ممکنه یک کد ملی از 1 تا 10 بار تکرار شده باشه (کل جدول شما 150 هزارتا ردیف می باشد با تکرار)

داخل ستون دیگر کدهای مختلفی خورده است مثلآ کدهای بیماری های مختلف

توضیح بیشتر اینکه داخل این جدول هر کد ملی دارای کدهای بیماری مختلفی هستش مثلا ممکنه یک فرد شامل نهایتآ

10 تا کد بیماری باشه و بهمین دلیل کد ملی 10 بار تکرار شده است (امیدوارم واضح گفته باشم )

حالا می خواهم این کدملی که ممکنه شامل 1تا 10تا کد بیماری باشه را داخل یک ردیف (رکورد) نشان بدهم

مثلا اگه کد ملی فرد باشه 00748965232و کد بیماریها باشه 22و32و42و55

بجای 4تا ردیف ، یک ردیف داشته باشم داخل جدول بصورت زیر

00748965232 ---- 22 -- 32 -- 42 --- 55 --

ولی حالت قبلش به این صورت بوده

00748965232 ---- 22
00748965232 ---- 32
00748965232 ---- 42
00748965232 ---- 55

فکر میکنم با دستور Pivot میشه اینکار را کرد ولی خودم نتوستم

محمد سلیم آبادی
سه شنبه 29 دی 1388, 14:38 عصر
با این توضیحات شما نیاز به تابع row_number با ویژه گی partition by هم دارین.


Declare @table table
(id int,
code int
unique (id, code));

insert into @table
values (1, 1), (1, 2), (1, 4),(1,12),(1,54),(1,80),
(2, 85),(2, 90),(2,95),(2, 96),(2, 99),
(3, 15),(3, 48),(3, 90),
(4, 70);

select *
from (select row_id = ROW_NUMBER()
over (partition by id order by code), *
from @table) as d
pivot
(max(code) for row_id in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10])) as p;
/*
id 1 2 3 4 5 6 7 8 9 10
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
1 1 2 4 12 54 80 NULL NULL NULL NULL
2 85 90 95 96 99 NULL NULL NULL NULL NULL
3 15 48 90 NULL NULL NULL NULL NULL NULL NULL
4 70 NULL NULL NULL NULL NULL NULL NULL NULL NULL

(4 row(s) affected)
*/

محمد سلیم آبادی
سه شنبه 29 دی 1388, 15:04 عصر
فراموش کردم یک توضیح مختصری بدم تا بتوانید در پروژه ی خود از کدها استفاده کنین.
Id را کد ملی و code را کد بیماری تصور کنین.
در جدول مشتق شده d به جای * اسامی ستون های کدملی و کد بیماری را قرار دهین تا نتیجه ی درست حاصل شود (چون مطمئنا در جدول مذکور بیش از دو ستون کدملی و کدبیماری درج شده است).

A.Farzin
چهارشنبه 30 دی 1388, 07:13 صبح
با سلام
راهنمايي آقاي Msalim كافي به نظر مي‌رسد. ولي اگر خواستيد مانند اين مشكل، قبلاً مطرح شده است. لينك زير را ببينيد.
http://www.barnamenevis.org/forum/showthread.php?t=199503&highlight=pivot