# Native Code > برنامه نویسی در Delphi > بانک های اطلاعاتی در Delphi > حرفه ای: چندین SELECT در یک Query

## masoode

سلام
من برای طراحی داشبورد نرم افزارم صفحه ای دارم که در آن چندین گراف وجود دارد. من برای هر گراف یک TADOQUERY روی فرم گذاشته ام. آیا این امکان وجود دارد که همه SELECT را در یک کوئری بنویسم (مثل SQL Server که با دستور GO از هم جدا میکنیم) 
SELECT FullName,COUNT(*)CNT
FROM tblSF03Log A INNER JOIN tblUsersLogin B ON A.OperatorID=B.ID
WHERE DATEPART(YEAR,DT)=DATEPART(YEAR,SYSDATETIME())
GROUP BY FullName

go
Declare @tmp	real
SET @tmp=(100.0/(SELECT COUNT(*) FROM vwSF03Log WHERE (CostFilled=1 OR QCManOk=1)and DATEPART(YEAR,DT)=DATEPART(YEAR,SYSDATETIME())))
SELECT B.Name,(SUM(ValidWaste)*@tmp)ValidWasteCNT,(SUM(In  validWaste)*@tmp)InvalidWasteCNT
FROM vwSF03Log A 
INNER JOIN tblFactors B ON A.WasteFactor=B.Id
WHERE CostFilled=1 and DATEPART(YEAR,DT)=DATEPART(YEAR,SYSDATETIME())
GROUP BY B.Name

go
SELECT B.FullName,(A.ValidWasteCNT*100.0/C.CNT)ValidWasteCNT,(A.InvalidWasteCNT*100.0/C.CNT)InvalidWasteCNT
FROM(
	SELECT OperatorID,SUM(ValidWaste)ValidWasteCNT,SUM(Invali  dWaste) InvalidWasteCNT
	FROM vwSF03Log 
	WHERE WasteFactor is not null and Cost is not null and DATEPART(YEAR,DT)=DATEPART(YEAR,SYSDATETIME())
	GROUP BY OperatorID
	)A
	INNER JOIN tblUsersLogin B ON A.OperatorID=B.Id
	INNER JOIN (
		SELECT OperatorID,COUNT(*) CNT
		FROM vwSF03Log
		WHERE ((WasteFactor is not null and Cost is not null)or(QCManOk=1))and DATEPART(YEAR,DT)=DATEPART(YEAR,SYSDATETIME())
		GROUP BY OperatorID) C ON A.OperatorID=C.OperatorID

go
SELECT B.Name as Model,(A.ValidWasteCNT*100.0/C.CNT)ValidWasteCNT,(A.InvalidWasteCNT*100.0/C.CNT)InvalidWasteCNT
FROM(
	SELECT ModelIranCode,SUM(ValidWaste)ValidWasteCNT,SUM(Inv  alidWaste) InvalidWasteCNT
	FROM vwSF03Log 
	WHERE CostFilled=1 and DATEPART(YEAR,DT)=DATEPART(YEAR,SYSDATETIME())
	GROUP BY ModelIranCode
	)A
	INNER JOIN tblSubProductTypes B ON A.ModelIranCode=B.Id
	INNER JOIN (
		SELECT ModelIranCode,COUNT(*) CNT
		FROM vwSF03Log
		WHERE ((WasteFactor is not null and Cost is not null)or(QCManOk=1))and DATEPART(YEAR,DT)=DATEPART(YEAR,SYSDATETIME())
		GROUP BY ModelIranCode
		) C ON A.ModelIranCode=C.ModelIranCode

go
SELECT B.Name as Model,COUNT(*)CNT
FROM vwSF03Log A 
INNER JOIN tblSubProductTypes B ON A.ModelIranCode=B.Id
WHERE DATEPART(YEAR,DT)=DATEPART(YEAR,SYSDATETIME())
GROUP BY B.Name

go
SELECT B.Name as Organ,COUNT(*)CNT 
FROM vwSF03Log A
INNER JOIN tblFactors B ON A.WasteFactor=B.Id
WHERE ((CostFilled=1)or(QCManOk=1))and DATEPART(YEAR,DT)=DATEPART(YEAR,SYSDATETIME())
GROUP BY B.Name

----------


## یوسف زالی

سلام.
نبازی به Go نیست
همه رو با هم بگذارید و برای این که نتایج رو ببینید از رکوردست استفاده کنید
می تونید با استفاده از دستور NextRecordSet به رکوردست بعدی اشاره کنید
البته شما نمی تونید با استفاده از این فرمت و تنها یک شی، گریدی متصل داشته باشید که همه رو با هم نشون بده، با گرید های استاندارد نمی تونید چنین کاری کنید

----------


## masoode

:تشویق:  :تشویق: 
متشکرم
(دکمه تشکر کردن کجا رفته؟)

----------


## masoode

به نظر شما اگر حجم دیتای برگشتی بالا باشه و من روی فرمم به ازای هر DBGrid یک ADOQuery بگذارم سرعت کارم بهتر میشه یا اینکه یک ADOQuery بگذارم که توی SQL اش همین کد بالا را بگذارم و به ازای هر DBGrid یک ADODataset  بگذارم و با ADODataSet1.Recordset:= ADOQuery1.NextRecordset(i) آن را پر کنم؟

----------


## یوسف زالی

کاملا بستگی به کوئری تون داره
چنانچه تایم اوت نمی گیرید، و کوئری هاتون به هم مرتبط هستند یا از جداول مشترک استفاده زیادی می کنند یا فیلترهای مشابهی دارند .. استفاده از یک شی برای همه شون انتخاب خوبیه
چنانچه مولتی ترد، یا آسنکرون کار می کنید، استفاده از یک شی انتخاب خوبی نیست
در غیر این صورت تفاوت چندانی نداره

----------

