0

group by 句のエラー :: MS sql.here でレコードを一意にしたいのですが、2 ~ 3 個のテーブルの結合と when 句を使用しています。group by 句を使用して区別するのはより難しく、次のようなエラーが発生します。

Error :::: Incorrect syntax near the keyword 'GROUP'

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 "PHONE1", 
    m.cell_phone AS "PHONE2", 
    m.address+','+m.city+','+m.state+','+m.zip_code AS "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
        )
        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;
4

2 に答える 2

3

今分かります。後にサブクエリ名を追加する必要があります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;
于 2011-02-15T11:59:45.190 に答える
1

これに関するいくつかの問題の詳細に入るだけです:

サブクエリの 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

他のみんなと同じように、これによりおそらく group by 句の必要性がなくなると思います

また、サブクエリの where 句を次のように変更します。

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

また、paydamt とモード コードを次のように変更します。

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

また、列のエイリアシングに矛盾があります。特定のポイントで、Column Name= を使用するか、「列名」として、または [列名] としても使用しています。これはかなり紛らわしいので、列に別名を付ける方法を 1 つ選択し、それをそのまま使用します。

また、結合の修正が機能し、group by を実行する必要がない場合は、サブクエリからすべてを移動する必要がないため、

于 2011-02-15T21:16:41.873 に答える