ورود

View Full Version : مشکل در کوئری



Hossein Bazyan
سه شنبه 20 بهمن 1388, 16:34 عصر
سلام
در جدول مقابل من سه تا فیلد دارم که


Field1 Field2 Filed3
F1 F2 F3
F1 R2 R3
T1 F2 T3
D1 D2 D3
F1 F2 J3


حال میخوام در آخرین سطر تعداد رکوردها را داشته باشم . میتوان از Count و Group By استفاده کرد اما مشکل اینجاست که میخوام همه رکوردها نمایش داده شوند در Group By رکوردها را دسته بندی میکند مثلا در مثال بالا به ازای F1 فقط یک سطر برگردانده میشود.
در خروجی باید لیست همه رکوردها نمایش داده شود و در اخر هم تعداد رکوردهای F1 و D1 و T1 از فیلد Field1 باید نمایش داده شود.
مثلا در مثال بالا ما سه رکورد به ازای F1 و 1 رکورد به ازای T1 و یک رکورد به ازای D1 داریم که باید در آخر سر نمایش داده شود.

محمد سلیم آبادی
سه شنبه 20 بهمن 1388, 17:08 عصر
سلام،
گرچه من هنوز دقیق متوجه نشدم چه نتیجه ای انتظار دارین.
این دو نتیجه و کوئری هایشان را بررسی کنید:



declare @t table (Field1 Char(2),
Field2 char(2),
Field3 Char(3));

insert @t values
('F1','F2','F3'),
('F1','R2','R3'),
('T1','F2','T3'),
('D1','D2','D3'),
('F1','F2','J3')

SELECT *
FROM @t

/*
Field1 Field2 Field3
------ ------ ------
F1 F2 F3
F1 R2 R3
T1 F2 T3
D1 D2 D3
F1 F2 J3
*/

SELECT *
FROM @t
UNION ALL
SELECT CAST(SUM(CASE WHEN Field1 = 'F1' THEN 1 ELSE 0 END) AS VARCHAR(2)),
CAST(SUM(CASE WHEN Field1 = 'D1' THEN 1 ELSE 0 END) AS VARCHAR(2)),
CAST(SUM(CASE WHEN Field1 = 'T1' THEN 1 ELSE 0 END) AS VARCHAR(2))
FROM @t;

/*
Field1 Field2 Field3
------ ------ ------
F1 F2 F3
F1 R2 R3
T1 F2 T3
D1 D2 D3
F1 F2 J3
3 1 1
*/

SELECT *,
SUM(CASE WHEN Field1 = 'F1' THEN 1 ELSE 0 END) OVER() AS 'F1',
SUM(CASE WHEN Field1 = 'D1' THEN 1 ELSE 0 END) OVER() AS 'D1',
SUM(CASE WHEN Field1 = 'T1' THEN 1 ELSE 0 END) OVER() AS 'T1'
FROM @t

/*
Field1 Field2 Field3 F1 D1 T1
------ ------ ------ ----------- ----------- -----------
F1 F2 F3 3 1 1
F1 R2 R3 3 1 1
T1 F2 T3 3 1 1
D1 D2 D3 3 1 1
F1 F2 J3 3 1 1
*/

Hossein Bazyan
سه شنبه 20 بهمن 1388, 17:30 عصر
سلام،
گرچه من هنوز دقیق متوجه نشدم چه نتیجه ای انتظار دارین.
این دو نتیجه و کوئری هایشان را بررسی کنید:



SELECT *
FROM @t
UNION ALL
SELECT CAST(SUM(CASE WHEN Field1 = 'F1' THEN 1 ELSE 0 END) AS VARCHAR(2)),
CAST(SUM(CASE WHEN Field1 = 'D1' THEN 1 ELSE 0 END) AS VARCHAR(2)),
CAST(SUM(CASE WHEN Field1 = 'T1' THEN 1 ELSE 0 END) AS VARCHAR(2))
FROM @t;

/*
Field1 Field2 Field3
------ ------ ------
F1 F2 F3
F1 R2 R3
T1 F2 T3
D1 D2 D3
F1 F2 J3
3 1 1
*/



سلام
مرسی از راهنمایی
دقیقا منظور من همین متن میباشد اما پیغام خطای زیر را میگیرم



Msg 205, Level 16, State 1, Line 1
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

محمد سلیم آبادی
سه شنبه 20 بهمن 1388, 17:34 عصر
SELECT Field1, Field2, Field3
FROM @t
UNION ALL
SELECT CAST(SUM(CASE WHEN Field1 = 'F1' THEN 1 ELSE 0 END) AS VARCHAR(2)),
CAST(SUM(CASE WHEN Field1 = 'D1' THEN 1 ELSE 0 END) AS VARCHAR(2)),
CAST(SUM(CASE WHEN Field1 = 'T1' THEN 1 ELSE 0 END) AS VARCHAR(2))
FROM @t;

Hossein Bazyan
سه شنبه 20 بهمن 1388, 17:39 عصر
SELECT Field1, Field2, Field3
FROM @t
UNION ALL
SELECT CAST(SUM(CASE WHEN Field1 = 'F1' THEN 1 ELSE 0 END) AS VARCHAR(2)),
CAST(SUM(CASE WHEN Field1 = 'D1' THEN 1 ELSE 0 END) AS VARCHAR(2)),
CAST(SUM(CASE WHEN Field1 = 'T1' THEN 1 ELSE 0 END) AS VARCHAR(2))
FROM @t;

سلام
همان پیغام را میگیرم
کوئری من به شکل زیر میباشد:


SELECT id, OpmerkingAfspraak, OpmerkingOverige, CalculatieDatum
FROM [900].[dbo].[Calculatie_Main]
UNION ALL
SELECT CAST(SUM(CASE WHEN OpmerkingOverige = 'Offerte' THEN 1 ELSE 0 END) AS VARCHAR(200)),
CAST(SUM(CASE WHEN OpmerkingOverige = 'Order' THEN 1 ELSE 0 END) AS VARCHAR(200)),
CAST(SUM(CASE WHEN OpmerkingOverige = 'Vervallen' THEN 1 ELSE 0 END) AS VARCHAR(200))
FROM [900].[dbo].[Calculatie_Main];


که میخوام تمامی رکوردها نمایش داده شوند سپس تعداد رکوردهایی که فیلد OpmerkingOverige آنها Offerte و Order و Vervallen میباشد را برایم بشمارد.

محمد سلیم آبادی
سه شنبه 20 بهمن 1388, 17:44 عصر
Data Type های این چهار ستون به ترتیب چیه؟ آیا تمام ستون ها به غیر از id از نوع کاراکتر/رشته هستند؟
id, OpmerkingAfspraak, OpmerkingOverige, CalculatieDatum

اگر جواب بالا مثبت است این کوئری را اجرا کنید:


SELECT id, OpmerkingAfspraak, OpmerkingOverige, CalculatieDatum
FROM [900].[dbo].[Calculatie_Main]
UNION ALL
SELECT NULL,
CAST(SUM(CASE WHEN OpmerkingOverige ='Offerte' THEN 1 ELSE 0 END)AS VARCHAR(200)),
CAST(SUM(CASE WHEN OpmerkingOverige ='Order' THEN 1 ELSE 0 END)AS VARCHAR(200)),
CAST(SUM(CASE WHEN OpmerkingOverige ='Vervallen'THEN 1 ELSE 0 END)AS VARCHAR(200))
FROM [900].[dbo].[Calculatie_Main];

Hossein Bazyan
سه شنبه 20 بهمن 1388, 18:56 عصر
Data Type های این چهار ستون به ترتیب چیه؟ آیا تمام ستون ها به غیر از id از نوع کاراکتر/رشته هستند؟
id, OpmerkingAfspraak, OpmerkingOverige, CalculatieDatum

اگر جواب بالا مثبت است این کوئری را اجرا کنید:


SELECT id, OpmerkingAfspraak, OpmerkingOverige, CalculatieDatum
FROM [900].[dbo].[Calculatie_Main]
UNION ALL
SELECT NULL,
CAST(SUM(CASE WHEN OpmerkingOverige ='Offerte' THEN 1 ELSE 0 END)AS VARCHAR(200)),
CAST(SUM(CASE WHEN OpmerkingOverige ='Order' THEN 1 ELSE 0 END)AS VARCHAR(200)),
CAST(SUM(CASE WHEN OpmerkingOverige ='Vervallen'THEN 1 ELSE 0 END)AS VARCHAR(200))
FROM [900].[dbo].[Calculatie_Main];


سلام
id از نوع عدد و CalculatieDatum از نوع تاریخ و بقیه رشته هستند
در ضمن در اجرای این کوئری پیغام خطای زیر صادر میشود


Msg 241, Level 16, State 1, Line 1
Conversion failed when converting datetime from character string.

و اگر فیلد تاریخ را هم حذف میکنم پیغام زیر صادر میشود.


Msg 205, Level 16, State 1, Line 1
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.


ممنون از توجهتان

محمد سلیم آبادی
سه شنبه 20 بهمن 1388, 19:03 عصر
هنگامی که می خواهید دو مجوعه از داده ها را با یکدیگر اجتماع کنید باید تعداد ستون در targer list (Column List) یکسان باشد. از طرفی باید Data type هایشان هم قابل تبدیل به یکدیگر باشند یا از یک نوع باشند.

وقتی در SELECT اول چهار ستون انتخاب می شود در قسمت لیست ستون های SELECT دوم هم باید 4 ستون نوشته شود.

حالا Select Query دوم که سه ستون را بر می گرداند را میخواهیم با 4 ستون اجتماع کنیم. در اینجا ناچاریم که یک ستون با مقدار ثابت null به کوئری دوم اضافه کنیم تا تعداد ستون ها برابر بشن.

این اصول کلی را در نظر گرفته سپس کوئری را ایجاد کنید.
در ضمن این کارتان اصلا منطقی به نظر نمی رسد. شاید دنبال چیز دیگری هستین.

Hossein Bazyan
سه شنبه 20 بهمن 1388, 19:21 عصر
سلام
ببینید دوست عزیز آنچه که من میخوام انجام بدم اینه
من میخواهم لیستی از فیلدهای
id, OpmerkingAfspraak, OpmerkingOverige, CalculatieDatum
را نمیش بدم حال فیلد OpmerkingOverige یکی از سه مقادیر Offerte و Order و Vervallen را دارد حال میخوام لیست را بر اساس OpmerkingOverigeمرتب کنم یعنی اول کلیه رکوردهایی که فیلد OpmerkingOverige آنها Offerte هست را نمایش داده سپس تعداد رکوردها را بعنوان Total نمایش سپس رکوردهایی را که فیلد OpmerkingOverige آنها Offerte میباشد را نمایش و سپس تعداد آنها را نوشته و در آخر کلیه رکوردهایی که فیلد OpmerkingOverige آنها Vervallen میباشد را نمایش داده و چاپ کند .
به فایل ضمیمه دقت فرمائید.

محمد سلیم آبادی
سه شنبه 20 بهمن 1388, 21:52 عصر
سلام،
اینجور گزارشات را بهتره توسط نرم افزارهای گزارش سازی انجام بدین.

Hossein Bazyan
سه شنبه 20 بهمن 1388, 22:14 عصر
سلام،
اینجور گزارشات را بهتره توسط نرم افزارهای گزارش سازی انجام بدین.
سلام
همینکار رو هم کردم اما میخواستم با یه کوئری انجام بدم.
به هر حال از پاسخگویی شما سپاسگزارم