0

group by 子句中的错误 :: 我想让记录在 MS sql 中唯一。这里我使用了 2-3 个表 join 和 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'

另外,我会将您的 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

此外,您的列别名也不一致。在某些情况下,您使用 Column Name=,或者您将其用作“Column Name”,甚至用作 [Column Name]。这相当令人困惑,所以我会选择一种别名列的方法并坚持下去。

此外,如果修复连接有效并且不需要您进行分组,那么将所有内容移出子查询,因为不需要它

于 2011-02-15T21:16:41.873 回答