SQL Server Group с помощью предложения WHEN - PullRequest
0 голосов
/ 15 февраля 2011

Ошибка в выражении group byболее трудно выделить его, используя выражение group by, которое выдает ошибку вроде

Ответы [ 2 ]

3 голосов
/ 15 февраля 2011

Теперь я понимаю. Вам нужно добавить имя подзапроса после 2008)

select *
from(
  SELECT TOP 5
    m.pk_member_id,
    m.first_name+' '+m.middle_name+' '+m.last_name as "NAME",
    m.gender AS "GENDER",
    datediff(Year,m.date_of_birth, getdate()) AS "AGE",
    m.home_email AS "EMAIL",
    m.business_phone AS "PHONE Num 1",
    m.cell_phone AS "PHONE NUM 2",
    m.address+','+m.city+','+m.state+','+m.zip_code AS "MAILING ADDRESS",
    paidamt = CASE WHEN (moi.credit_card_amt!=null or moi.credit_card_amt > 0) THEN moi.credit_card_amt
                   WHEN (moi.cheque_amt!=null or moi.cheque_amt > 0) THEN moi.cheque_amt
                   WHEN (moi.debit_card_amt!=null or moi.debit_card_amt > 0) THEN moi.debit_card_amt
                   WHEN (moi.cash_amt!=null or moi.cash_amt > 0) THEN moi.cash_amt END,
    mode = CASE WHEN (moi.credit_card_amt!=null or moi.credit_card_amt > 0) THEN 'CREDIT CARD'
                WHEN (moi.cheque_amt!=null or moi.cheque_amt > 0) THEN 'CHEQUE'
                WHEN (moi.debit_card_amt!=null or moi.debit_card_amt > 0) THEN 'DEBIT CARD'
                WHEN (moi.cash_amt!=null or moi.cash_amt > 0) THEN 'CASH' END,
    m.registration_date as "JOINING DATE",
    m.membership_expiry_date as "EXPIRY DATE",
    services = CASE WHEN m.pk_member_id=em.fk_member_id THEN 'EVENT'
                      WHEN m.pk_member_id=dm.fk_member_id THEN 'DINING'
                      WHEN m.pk_member_id=jm.fk_member_id THEN 'JF2' END
  FROM
    Member m,
    Member_Official_Info moi,
    Event_Members em,
    Dining_Members dm,
    JF2_Members jm
  WHERE
    m.pk_member_id = moi.fk_member_id and
    (m.pk_member_id = em.fk_member_id or m.pk_member_id = dm.fk_member_id or m.pk_member_id = jm.fk_member_id) and
    YEAR(m.membership_expiry_date)=2008) as Q
group by
  m.pk_member_id,
  m.first_name,
  m.middle_name,
  m.last_name,
  m.business_phone,
  m.cell_phone,
  m.address,
  m.city,
  m.state,
  m.zip_code,
  m.gender,
  m.date_of_birth,
  m.home_email,
  m.registration_date,
  m.membership_expiry_date,
  services,paidamt,mode;
1 голос
/ 16 февраля 2011

просто подробно расскажу о некоторых проблемах с этим:

замените предложение from в подзапросе на что-то вроде этого:

from Member m
    inner join Member_Official_Info moi
        on m.pk_member_id=moi.fk_member_id
    left outer join Event_Members em
        on m.pk_member_id=em.fk_member_id
    left outer join Dining_Members dm
        on m.pk_member_id=em.fk_member_id
    left outer join JF2_Members jm
        on m.pk_member_id=em.fk_member_id

Я думаю, как и всеиначе, это, вероятно, устранит необходимость в вашей группе с помощью предложения

. Я бы также изменил ваше условие where в подзапросе на:

where m.membership_expiry_date>='1/1/2008'
    and m.membership_expiry_date<'1/1/2009'

Кроме того, я бы изменилваш payamt и код режима примерно такой:

case when coalesce(moi.credit_card_amt,0)>0 then moi.credit_card_amt
    when coalesce(moi.cheque_amt,0)>0 then moi.cheque_amt
    case when coalesce(moi.debit_card_amt,0)>0 then moi.debit_card_amt
    case when coalesce(moi.cash_amt,0)>0 then moi.cash_amt

Кроме того, существует несоответствие с псевдонимами столбцов.в определенных точках вы используете имя столбца =, или вы используете как «имя столбца», или даже как [имя столбца].Это довольно запутанно, поэтому я бы выбрал один из путей к столбцам псевдонимов и придерживался его.

Кроме того, если исправление объединений работает и не требует, чтобы вы делали группу, то переместите все изпричина подзапроса нет необходимости

...