مرتضی حمزه ئی
سه شنبه 22 دی 1388, 09:12 صبح
با سلام خدمت اساتید یک فایل دارم که اطلاعات بیمه تکمیلی پرسنل داخل اون هست که ساختار اون بصورت زیر است
([PER_NO] ,[NAMEBABY] ,[FAMILYBABY],[RELCODE] ,[BIRTHDATE])
که شماره پرسنل دراون تکرار میشه ونام ونام خانوادگی افراد بیمه تکمیلی اون با تاریخ تولد داخل فایل baby قرار میگیره فیلد relcode هم مشخص میکنه که فرد همسر یا دختر وپسر یا پدر مادر پرسنل است حالا موقعی که میخوام گزارش بسازم گزارش طبق فرمت پیوست بصورت خطی است یعنی شماره پرسنل در یک ردیف وتمام افرادتحت بیمه اون پرسنل توی اون سطر قرار میگیرن تعداد فرزند حداکثر 6 است وپدرمادروهمسر نیز همراه با تاریخ تولد اونها باید جلوی پرسنل قراربگیره سوالم اینه چطوری select بنویسم که بتونم داخل گزارش بنشونم
همه اطلاعات دریک فایل baby است ولی خروجی که میخوام بگیرم ازاطلاعات این فایل است با فرمت خاصی که درضمیمه است
وبا pivot هم نمیشه چون درگزارش به ازای هر relcode نام ونام خانوادگی بیمه شده با تاریخ تولدش راهمزمان میخوام زیرش داشته باشم وازتوابع AGGREGATE نمیتوانم استفاده کنم چون میخوام هم نام ونام خانوادگی وهم تاریخ تولد و relcode را به ازای افراد بیمه شده اون پرسنل کنارهم داشته باشم
من با یک مثال ساختار را دوباره توضیح میدم :
per_no=740325,relcode=3,namebaby=maryam,familybaby =alavi,datebaby=80/01/12
per_no=740325,relcode=3,namebaby=mahsa,familybaby= alavi,datebaby=85/01/14
per_no=740325,relcode=1,namebaby=mahnaz,familybaby =ahmady,datebaby=55/10/22
per_no=740325,relcode=2,namebaby=abas,familybaby=a lavi,datebaby=40/11/18
فرض کنید که این اطلاعات برای یک پرسنل باشد relcode=3 یعنی فرزند وrelcode=1 همسر ,relcode=2 پدر استکه افراد بیمه تکمیلی شده پرسنل 740325 است بعضی از پرسنل شاید پدرمادرشان جزو بیمه تکمیلی نباشد وبعضی ها هم شاید فرزند نداشته باشند ولی حداکثر شش فرزند است حالا میخوام اطلاعات پرسنل را بصورت خطی زیر داشته باشم فایل ضمیمه خواهش میکنم کمک کنید باید بصورت خطی بتونم رکورد رابنشونم ازهمه اساتید خواهش میکنم کمک کنید تمرین خیلی خوبی واسه حرفه ایها به خیلی ها دادم هنوزجواب نگرفتم
A.Farzin
سه شنبه 22 دی 1388, 16:13 عصر
با سلام
كدهاي زير شايد آن چيزي باشد كه شما ميخواهيد. توجه داشته باشيد كه علت طولاني بودن اين كدها به خاطر توليد يك ستون ID براي هر يك از 6 بچه و 2 همسر است. اگر شما اين ID را در جدولتان داشته باشيد، كوئري را بسيار مختصرتر هم ميشد نوشت.
ابتدا به کمک کد زیر جدول و دادههای لازم را ایجاد کنید:
-- ساخت جدول
CREATE TABLE #tblBABY
(PER_NO int,
NAMEBABY nvarchar(20),
FAMILYBABY nvarchar(30),
RELCODE int,
BIRTHDATE datetime)
GO
-- ایجاد دادههای لازم
-- Personely 101
INSERT INTO #tblBABY VALUES (101, 'پدر', 'Ahmadi', 2, getdate())
INSERT INTO #tblBABY VALUES (101, 'زن1', 'ZanAwalAhmadi', 1, getdate())
INSERT INTO #tblBABY VALUES (101, 'زن2', 'ZamDovomAhmadi', 1, getdate())
INSERT INTO #tblBABY VALUES (101, 'بچه1', 'Ahmadi', 3, getdate())
INSERT INTO #tblBABY VALUES (101, 'بچه2', 'Ahmadi', 3, getdate())
INSERT INTO #tblBABY VALUES (101, 'بچه3', 'Ahmadi', 3, getdate())
INSERT INTO #tblBABY VALUES (101, 'بچه4', 'Ahmadi', 3, getdate())
INSERT INTO #tblBABY VALUES (101, 'بچه5', 'Ahmadi', 3, getdate())
INSERT INTO #tblBABY VALUES (101, 'بچه6', 'Ahmadi', 3, getdate())
-- Personely 102
INSERT INTO #tblBABY VALUES (102, 'پدر', 'Alavi', 2, getdate())
INSERT INTO #tblBABY VALUES (102, 'زن1', 'ZanAwalAlavi', 1, getdate())
INSERT INTO #tblBABY VALUES (102, 'زن2', 'ZamDovomAlavi', 1, getdate())
INSERT INTO #tblBABY VALUES (102, 'بچه1', 'Alavi', 3, getdate())
INSERT INTO #tblBABY VALUES (102, 'بچه2', 'Alavi', 3, getdate())
INSERT INTO #tblBABY VALUES (102, 'بچه3', 'Alavi', 3, getdate())
INSERT INTO #tblBABY VALUES (102, 'بچه4', 'Alavi', 3, getdate())
INSERT INTO #tblBABY VALUES (102, 'بچه5', 'Alavi', 3, getdate())
INSERT INTO #tblBABY VALUES (102, 'بچه6', 'Alavi', 3, getdate())
-- Personely 103
INSERT INTO #tblBABY VALUES (103, 'پدر', 'Akbari', 2, getdate())
INSERT INTO #tblBABY VALUES (103, 'زن1', 'ZanAwalAkbari', 1, getdate())
INSERT INTO #tblBABY VALUES (103, 'زن2', 'ZamDovomAkbari', 1, getdate())
INSERT INTO #tblBABY VALUES (103, 'بچه1', 'Akbari', 3, getdate())
INSERT INTO #tblBABY VALUES (103, 'بچه2', 'Akbari', 3, getdate())
INSERT INTO #tblBABY VALUES (103, 'بچه3', 'Akbari', 3, getdate())
INSERT INTO #tblBABY VALUES (103, 'بچه4', 'Akbari', 3, getdate())
INSERT INTO #tblBABY VALUES (103, 'بچه5', 'Akbari', 3, getdate())
INSERT INTO #tblBABY VALUES (103, 'بچه6', 'Akbari', 3, getdate())
-- Personely 104
INSERT INTO #tblBABY VALUES (104, 'پدر', 'Erfani', 2, getdate())
INSERT INTO #tblBABY VALUES (104, 'زن1', 'ZanAwalErfani', 1, getdate())
INSERT INTO #tblBABY VALUES (104, 'زن2', 'ZamDovomErfani', 1, getdate())
INSERT INTO #tblBABY VALUES (104, 'بچه1', 'Erfani', 3, getdate())
INSERT INTO #tblBABY VALUES (104, 'بچه2', 'Erfani', 3, getdate())
INSERT INTO #tblBABY VALUES (104, 'بچه3', 'Erfani', 3, getdate())
INSERT INTO #tblBABY VALUES (104, 'بچه4', 'Erfani', 3, getdate())
INSERT INTO #tblBABY VALUES (104, 'بچه5', 'Erfani', 3, getdate())
INSERT INTO #tblBABY VALUES (104, 'بچه6', 'Erfani', 3, getdate())
SELECT * FROM #tblBABY
کوئری مورد نظر با استفاده از CASE WHEN ...
-- جواب با استفاده از CASE WHEN ...
SELECT PER_NO,
MIN(Nam21) AS Nam21, MIN(Fam21) AS Fam21,
MIN(Nam11) AS Nam11, MIN(Fam11) AS Fam11,
MIN(Nam12) AS Nam12, MIN(Fam12) AS Fam12,
MIN(Nam31) AS Nam31, MIN(Fam31) AS Fam31,
MIN(Nam32) AS Nam32, MIN(Fam32) AS Fam32,
MIN(Nam33) AS Nam33, MIN(Fam33) AS Fam33,
MIN(Nam34) AS Nam34, MIN(Fam34) AS Fam34,
MIN(Nam35) AS Nam35, MIN(Fam35) AS Fam35,
MIN(Nam36) AS Nam36, MIN(Fam36) AS Fam36
FROM (
SELECT PER_NO,
CASE WHEN RELCODE = 2 THEN NAMEBABY ELSE NULL END AS Nam21,
CASE WHEN RELCODE = 2 THEN FAMILYBABY ELSE NULL END AS Fam21,
CASE WHEN RELCODE = 1 AND PER_RNK = 1 THEN NAMEBABY ELSE NULL END AS Nam11,
CASE WHEN RELCODE = 1 AND PER_RNK = 1 THEN FAMILYBABY ELSE NULL END AS Fam11,
CASE WHEN RELCODE = 1 AND PER_RNK = 2 THEN NAMEBABY ELSE NULL END AS Nam12,
CASE WHEN RELCODE = 1 AND PER_RNK = 2 THEN FAMILYBABY ELSE NULL END AS Fam12,
CASE WHEN RELCODE = 3 AND PER_RNK = 1 THEN NAMEBABY ELSE NULL END AS Nam31,
CASE WHEN RELCODE = 3 AND PER_RNK = 1 THEN FAMILYBABY ELSE NULL END AS Fam31,
CASE WHEN RELCODE = 3 AND PER_RNK = 2 THEN NAMEBABY ELSE NULL END AS Nam32,
CASE WHEN RELCODE = 3 AND PER_RNK = 2 THEN FAMILYBABY ELSE NULL END AS Fam32,
CASE WHEN RELCODE = 3 AND PER_RNK = 3 THEN NAMEBABY ELSE NULL END AS Nam33,
CASE WHEN RELCODE = 3 AND PER_RNK = 3 THEN FAMILYBABY ELSE NULL END AS Fam33,
CASE WHEN RELCODE = 3 AND PER_RNK = 4 THEN NAMEBABY ELSE NULL END AS Nam34,
CASE WHEN RELCODE = 3 AND PER_RNK = 4 THEN FAMILYBABY ELSE NULL END AS Fam34,
CASE WHEN RELCODE = 3 AND PER_RNK = 5 THEN NAMEBABY ELSE NULL END AS Nam35,
CASE WHEN RELCODE = 3 AND PER_RNK = 5 THEN FAMILYBABY ELSE NULL END AS Fam35,
CASE WHEN RELCODE = 3 AND PER_RNK = 6 THEN NAMEBABY ELSE NULL END AS Nam36,
CASE WHEN RELCODE = 3 AND PER_RNK = 6 THEN FAMILYBABY ELSE NULL END AS Fam36
FROM (
SELECT CAST(CAST(PER_NO AS CHAR(3)) + CAST(RELCODE AS CHAR(1)) + CAST(PER_RNK AS CHAR(1)) AS int) AS UNID,
[NAMEBABY] + [FAMILYBABY] AS NF,
tmp0.* FROM (
SELECT PER_NO, RELCODE,
0 AS PER_RNK,
NAMEBABY, FAMILYBABY, BIRTHDATE
FROM #tblBABY
WHERE RELCODE = 2
UNION ALL
SELECT PER_NO, RELCODE,
NTILE(8) OVER(PARTITION BY PER_NO ORDER BY NAMEBABY ASC, FAMILYBABY ASC) AS PER_RNK,
NAMEBABY, FAMILYBABY, BIRTHDATE
FROM #tblBABY
WHERE RELCODE = 1
UNION ALL
SELECT PER_NO, RELCODE,
NTILE(8) OVER(PARTITION BY PER_NO ORDER BY NAMEBABY ASC, FAMILYBABY ASC) AS PER_RNK,
NAMEBABY, FAMILYBABY, BIRTHDATE
FROM #tblBABY
WHERE RELCODE = 3
) tmp0
) tmp1
) tmp2
GROUP BY PER_NO
Query مورد نظر با استفاده از Pivot:
-- جواب با استفاده از PIVOT
SELECT *
FROM (
SELECT PER_NO,
CAST(CAST(RELCODE AS CHAR(1)) + CAST(PER_RNK AS CHAR(1)) AS int) AS UNID,
[NAMEBABY] + ' ' + [FAMILYBABY] AS NF
FROM (
SELECT PER_NO, RELCODE,
0 AS PER_RNK,
NAMEBABY, FAMILYBABY, BIRTHDATE
FROM #tblBABY
WHERE RELCODE = 2
UNION ALL
SELECT PER_NO, RELCODE,
NTILE(8) OVER(PARTITION BY PER_NO ORDER BY NAMEBABY ASC, FAMILYBABY ASC) AS PER_RNK,
NAMEBABY, FAMILYBABY, BIRTHDATE
FROM #tblBABY
WHERE RELCODE = 1
UNION ALL
SELECT PER_NO, RELCODE,
NTILE(8) OVER(PARTITION BY PER_NO ORDER BY NAMEBABY ASC, FAMILYBABY ASC) AS PER_RNK,
NAMEBABY, FAMILYBABY, BIRTHDATE
FROM #tblBABY
WHERE RELCODE = 3
) tmp0
) tmp1
PIVOT (MIN(NF) FOR [UNID]
IN ([21], [11], [12], [31], [32], [33], [34], [35], [36])) as pv
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.