سؤال

باستخدام SQL Server 2005 أحاول المجموعة على أساس بيان حالة مع فرعي ، ولكن أنا الحصول على خطأ ("كل مجموعة من خلال التعبير يجب أن يحتوي على عمود واحد على الأقل الإشارة.").أنا يمكن أن تعمل جولة ذلك بسهولة تامة ، ولكن يمكن لأي شخص أن يشرح الخطأ ؟ لقد حصلت على عمود الإشارة إلى #header.رأس.

create table #header (header int)
create table #detail (header int, detail int)

insert into #header values (1)
insert into #header values (2)
insert into #header values (3)

insert into #detail values (1, 1)
insert into #detail values (2, 1)

--error: Each GROUP BY expression must contain at least one column reference.
select case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end hasrecords from #header
group by case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end

--results I want
select hasrecords, count(*) from
(
    select case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end hasrecords from #header
) hasrecords
group by hasrecords

drop table #header
drop table #detail

[تحرير] ملاحظة (ردا على التعليق) المترابطة وغير المترابطة الاستعلامات الفرعية:

--correlated
select header, case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end hasrecords from #header

--non-correlated
select #header.header, case when count(#detail.header) > 0 then 1 else 0 end hasrecords from #header left join #detail on #header.header = #detail.header group by #header.header
هل كانت مفيدة؟

المحلول

لبدء لو نعطي كامل الخطأ ، فإنه ينبغي أن تقرأ "كل مجموعة من خلال التعبير يجب أن يحتوي على عمود واحد على الأقل هذا ليس الخارجي المرجعية."

فهم خطأ, نحن بحاجة إلى توضيح ما هو المقصود من قبل 'الخارجي إشارة'

(ملاحظة:في هذه الحالة فإنه لا علاقة له مع الداخلي أو الخارجي ينضم)

على الداخلية و الخارجي في إشارة إلى الاستعلام الرئيسي و هو الاستعلامات الفرعية.في هذه الحالة EXISTS هو فرعي و هو يرتبط الاستعلام الفرعي كما أنه يحتوي على المراجع الخارجي #header.header, الذي هو الرجوع إلى الجدول الخارجي #header, بينما أي إشارة إلى #detail يعتبر الداخلي المراجع.

حتى في الجوهر ، لأن CASE يستخدم استعلام فرعي correlated مراجع الاستعلام الخارجي ، ثم هذه الحرائق الخطأ الدولة ، نتيجة تظهر رسالة الخطأ هذه عند محاولة استخدام فقط التعبيرات في مجموعة من شرط أن يتم تفسيره على المراجع الخارجي.

الاستعلامات الفرعية يمكن يمكن استخدامها في مجموعة ولكن لا يرتبط الاستعلامات الفرعية.

مشوش ، نفس الخطأ يمكن أن تتولد من غير subqueried أبسط الاستعلام مثل

select 
 case when header=1 then 1 
      else 0 
 end headeris1, 
 'constant' 
from #header 
group by case when header=1 then 1 else 0 end , 'constant'

أو حتى استبدال المستمر مع @variable

واضح الطين ؟

كيف

نصائح أخرى

وأنت تقول أن مجموعة من 1 أو 0 عندما تحتاج إلى إعطائها عمود الفعلي لمجموعة من (رأس)، وليس القيمة.

وحتى لو كنت أنا فهم الحق كنت ترغب قائمة رؤوس وعدد من سجلات التفصيل بهم؟

وهذا قد عمل لك؟

SELECT DISTINCT h.header, COUNT(d.detail) AS detail_count
FROM #header AS h
LEFT JOIN #detail AS d ON d.header = h.header
GROUP BY h.header, d.detail

ومع نتائج مثل ...

header   detail_count
1       1
2       1
3       0
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top