Select a Column in SQL not in Group By

前端 未结 7 1324
忘了有多久
忘了有多久 2020-11-30 02:25

I have been trying to find some info on how to select a non-aggregate column that is not contained in the Group By statement in SQL, but nothing I\'ve found so far seems to

相关标签:
7条回答
  • 2020-11-30 02:36

    What you are asking, Sir, is as the answer of RedFilter. This answer as well helps in understanding why group by is somehow a simpler version or partition over: SQL Server: Difference between PARTITION BY and GROUP BY since it changes the way the returned value is calculated and therefore you could (somehow) return columns group by can not return.

    0 讨论(0)
  • 2020-11-30 02:40

    The columns in the result set of a select query with group by clause must be:

    • an expression used as one of the group by criteria , or ...
    • an aggregate function , or ...
    • a literal value

    So, you can't do what you want to do in a single, simple query. The first thing to do is state your problem statement in a clear way, something like:

    I want to find the individual claim row bearing the most recent creation date within each group in my claims table

    Given

    create table dbo.some_claims_table
    (
      claim_id     int      not null ,
      group_id     int      not null ,
      date_created datetime not null ,
    
      constraint some_table_PK primary key ( claim_id                ) ,
      constraint some_table_AK01 unique    ( group_id , claim_id     ) ,
      constraint some_Table_AK02 unique    ( group_id , date_created ) ,
    
    )
    

    The first thing to do is identify the most recent creation date for each group:

    select group_id ,
           date_created = max( date_created )
    from dbo.claims_table
    group by group_id
    

    That gives you the selection criteria you need (1 row per group, with 2 columns: group_id and the highwater created date) to fullfill the 1st part of the requirement (selecting the individual row from each group. That needs to be a virtual table in your final select query:

    select *
    from dbo.claims_table t
    join ( select group_id ,
           date_created = max( date_created )
           from dbo.claims_table
           group by group_id
          ) x on x.group_id     = t.group_id
             and x.date_created = t.date_created
    

    If the table is not unique by date_created within group_id (AK02), you you can get duplicate rows for a given group.

    0 讨论(0)
  • 2020-11-30 02:41

    You can do this with PARTITION and RANK:

    select * from
    (
        select MyPK, fmgcms_cpeclaimid, createdon,  
            Rank() over (Partition BY fmgcms_cpeclaimid order by createdon DESC) as Rank
        from Filteredfmgcms_claimpaymentestimate 
        where createdon < 'reportstartdate' 
    ) tmp
    where Rank = 1
    
    0 讨论(0)
  • 2020-11-30 02:44

    You can use as below,

    Select X.a, X.b, Y.c from (
                    Select X.a as a, sum (b) as sum_b from name_table X
                    group by X.a)X
    left join from name_table Y on Y.a = X.a
    

    Example;

    CREATE TABLE #products (
        product_name VARCHAR(MAX),
        code varchar(3),
        list_price [numeric](8, 2) NOT NULL
    );
    
    INSERT INTO #products VALUES ('paku', 'ACE', 2000)
    INSERT INTO #products VALUES ('paku', 'ACE', 2000)
    INSERT INTO #products VALUES ('Dinding', 'ADE', 2000)
    INSERT INTO #products VALUES ('Kaca', 'AKB', 2000)
    INSERT INTO #products VALUES ('paku', 'ACE', 2000)
    
    --SELECT * FROM #products 
    SELECT distinct x.code, x.SUM_PRICE, product_name FROM (SELECT code, SUM(list_price) as SUM_PRICE From #products 
                   group by code)x
    left join #products y on y.code=x.code
    
    DROP TABLE #products
    
    0 讨论(0)
  • 2020-11-30 02:47

    You can join the table on itself to get the PK:

    Select cpe1.PK, cpe2.MaxDate, cpe1.fmgcms_cpeclaimid 
    from Filteredfmgcms_claimpaymentestimate cpe1
    INNER JOIN
    (
        select MAX(createdon) As MaxDate, fmgcms_cpeclaimid 
        from Filteredfmgcms_claimpaymentestimate
        group by fmgcms_cpeclaimid
    ) cpe2
        on cpe1.fmgcms_cpeclaimid = cpe2.fmgcms_cpeclaimid
        and cpe1.createdon = cpe2.MaxDate
    where cpe1.createdon < 'reportstartdate'
    
    0 讨论(0)
  • 2020-11-30 02:54

    Thing I like to do is to wrap addition columns in aggregate function, like max(). It works very good when you don't expect duplicate values.

    Select MAX(cpe.createdon) As MaxDate, cpe.fmgcms_cpeclaimid, MAX(cpe.fmgcms_claimid) As fmgcms_claimid 
    from Filteredfmgcms_claimpaymentestimate cpe
    where cpe.createdon < 'reportstartdate'
    group by cpe.fmgcms_cpeclaimid
    
    0 讨论(0)
提交回复
热议问题