View Full Version : عدم نمایش داده ها در full join
رامین مرادی
یک شنبه 19 شهریور 1396, 14:17 عصر
وقت بخیر دوستان من دستور زیر رو نوشتم اما خروجی که بهم میده کامل نیست. نتیجه درسته ولی چرا باید ستون اول و سوم null بیاد !!!!! کجای دستورم اشتباه هست؟
; with cte as(SELECT [Ensani_MorakhasiPersonnelTbl].[PersonnelId],
case
when SUBSTRING([Date2],6,2)> SUBSTRING([Date1],6,2) AND CONVERT(int,SUBSTRING([Date1],6,2))= 6 then CountDay-CONVERT(int,SUBSTRING([Date1],9,2))
when SUBSTRING([Date1],6,2)< SUBSTRING([Date2],6,2) AND CONVERT(int,SUBSTRING([Date2],6,2))=6 then CONVERT(int,SUBSTRING([Date2],9,2))
else CountDay end as CountDay FROM [Ensani_MorakhasiPersonnelTbl] inner join PersonnelTbl on [Ensani_MorakhasiPersonnelTbl].PersonnelId=PersonnelTbl.PersonnelId
where [Date1] between '1396/06/01' and '1396/06/31' or [Date2] between '1396/06/01' and '1396/06/31'
)
, cte1 as(SELECT [Ensani_MorakhasiPersonnelTbl].[PersonnelId]
,SUM([Ensani_MorakhasiPersonnelTbl].CountTime) as CountTime
FROM [Ensani_MorakhasiPersonnelTbl]
where [Date3] between '1396/06/01' and '1396/06/31'
group by [Ensani_MorakhasiPersonnelTbl].[PersonnelId]
)
select PersonnelTbl.PersonnelId,sum(cte.CountDay) as CountDay,PersonnelTbl.Name+' '+PersonnelTbl.Family as PerName,cte1.CountTime
from cte inner join PersonnelTbl on PersonnelTbl.PersonnelId=cte.PersonnelId full join cte1 on cte1.PersonnelId =PersonnelTbl.PersonnelId
group by PersonnelTbl.PersonnelId,PersonnelTbl.Name,Personn elTbl.Family,CountTime
اینم خروجی
146300
رامین مرادی
دوشنبه 20 شهریور 1396, 08:42 صبح
برا توضیح بیشتر. اسکریپت جداولمو میزارم برا تست
CREATE TABLE [dbo].[test](
[id] [int] IDENTITY(1,1) NOT NULL,
[PerId] [nvarchar](50) NULL,
[Name] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[test1](
[Id] [int] IDENTITY(1,1) NOT NULL,
[PerId] [nvarchar](50) NULL,
[Time] [nvarchar](50) NULL,
CONSTRAINT [PK_test1] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[test2](
[Id] [int] IDENTITY(1,1) NOT NULL,
[PerId] [nvarchar](50) NULL,
[Date] [nvarchar](50) NULL,
CONSTRAINT [PK_test2] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
من یه سری داده آزمایشی تو جداول ریختم . حالا کوئری زیر رو میزنم و خروجی که میبینم برام تعجب آوره. (حتما اشتباه میکنم یا روشم درست نیست)
این کوئری رو که میزنم چیزی نمایش نمیده
SELECT test.PerId, test.Name, test2.Date, test1.Time
FROM test INNER JOIN
test1 ON test.PerId = test1.PerId INNER JOIN
test2 ON test.PerId = test2.PerId
این کوئری رو هم که میزنم از جدول test2 فقط مقدار تایم رو میاره و نمیتونم اسم شخص رو هم بیارم (از جدول test1 هم اسم رو نشون میده هم تاریخ رو)بجاش null میزنه
select test.Name,test.PerId,test1.Time,test2.Date
from test inner join test1 on test.PerId=test1.PerId
full join test2 on test.PerId=test2.PerId
ممنون میشم راجب اصلاح این کوئری راهنماییم کنید
رامین مرادی
دوشنبه 20 شهریور 1396, 09:45 صبح
حل شد اونم چه حل شدنی :قهقهه::قهقهه::قهقهه::قهقهه:: هقهه:
عجیب ترین کدی که نوشتم. به احتمال زیاد پرفورمنسشم داغووون :لبخند:
; with cte as(SELECT [Ensani_MorakhasiPersonnelTbl].[PersonnelId],
case
when SUBSTRING([Date2],6,2)> SUBSTRING([Date1],6,2) AND CONVERT(int,SUBSTRING([Date1],6,2))= 6 then CountDay-CONVERT(int,SUBSTRING([Date1],9,2))
when SUBSTRING([Date1],6,2)< SUBSTRING([Date2],6,2) AND CONVERT(int,SUBSTRING([Date2],6,2))=6 then CONVERT(int,SUBSTRING([Date2],9,2))
else CountDay end as CountDay FROM [Ensani_MorakhasiPersonnelTbl] inner join PersonnelTbl on [Ensani_MorakhasiPersonnelTbl].PersonnelId=PersonnelTbl.PersonnelId
where [Date1] between '1396/06/01' and '1396/06/31' or [Date2] between '1396/06/01' and '1396/06/31'
)
, cte1 as(SELECT [Ensani_MorakhasiPersonnelTbl].[PersonnelId]
,SUM([Ensani_MorakhasiPersonnelTbl].CountTime) as CountTime
FROM [Ensani_MorakhasiPersonnelTbl]
where [Date3] between '1396/06/01' and '1396/06/31'
group by [Ensani_MorakhasiPersonnelTbl].[PersonnelId]
),
cte2 as(
select PersonnelTbl.PersonnelId,sum(cte.CountDay) as CountDay,PersonnelTbl.Name+' '+PersonnelTbl.Family as PerName,0.00 as CountTime
from cte join PersonnelTbl on PersonnelTbl.PersonnelId=cte.PersonnelId
group by PersonnelTbl.PersonnelId,PersonnelTbl.Name,Personn elTbl.Family
union
select PersonnelTbl.PersonnelId,0 as CountDay,PersonnelTbl.Name+' '+PersonnelTbl.Family as PerName,CONVERT(decimal(3,2),sum(cte1.CountTime)) as CountTime
from cte1 join PersonnelTbl on PersonnelTbl.PersonnelId=cte1.PersonnelId
group by PersonnelTbl.PersonnelId,PersonnelTbl.Name,Personn elTbl.Family
)
select cte2.PersonnelId,cte2.PerName,sum(CountDay),sum (CountTime )
from cte2
group by cte2.PersonnelId,cte2.PerName
Mahmoud.Afrad
دوشنبه 20 شهریور 1396, 18:30 عصر
اون جدولهای تستی که گذاشتید، برای چه هدفی join کردید؟ چون هیچ دلیل منطقی نمیبینم.
در مورد اسکریپتی که جواب گرفتید، بایست اسکریپت جداول باشه تا بشه تست کرد و ایرادهاش رو گرفت.
رامین مرادی
سه شنبه 21 شهریور 1396, 08:42 صبح
اون جدولهای تستی که گذاشتید، برای چه هدفی join کردید؟ چون هیچ دلیل منطقی نمیبینم.
در مورد اسکریپتی که جواب گرفتید، بایست اسکریپت جداول باشه تا بشه تست کرد و ایرادهاش رو گرفت.
بله درست میفرمایید. اما خب من توی پست دوم اسکریپت جداول رو گذاشتم (جدول نمونه هست. ). شما اگه بتونید بهترین روش رو برای جوین اون جداول بهم بدی ممنون میشم. خروجی از جوین اونا هم بشه (test.PerId,test.Name,Test1.Time,Test2.Date) همه افرادی که تایم دارن و تاریخ دارند یا یکی از اونا رو دارن...
البته خودم با union تونستم حلش کنم. اما میخوام ببینم میشه کوئری بهتری نوشت یا نه
پ ن : قبلا هم یه راهنمایی ازتون خواستم راجب کارکرد یک نفر تو یک ماه که برای میلادی کدی برام دادید اما دردسرای تبدیلات تاریخ مانع استفاده از اون کوئری شد و خودم یه راه حل دیگه برای تاریخ شمسی درست کردم.
Mahmoud.Afrad
سه شنبه 21 شهریور 1396, 18:30 عصر
سوال من اینه که چه ارتباطی بین ساعت و تاریخ هست و چرا در دو جدول؟ به نطر من جداول نمونه ای که گذاشتید کامل نیست و نمیشه همینطوری join کرد.
بهتر اینه که مسئله رو توضیح بدید که چه اطلاعاتی در چه جداولی دارید و چه خروجی میخواهید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.