【问题标题】:How to perform group by in sql如何在sql中执行分组
【发布时间】:2017-04-27 01:43:03
【问题描述】:

   SELECT [BarDetailId]
    ,[BarId]
    ,[Member]
    ,[MemberNo]
    ,[BarMark]
    ,[TypeSize]
    ,[BarLength]
    ,[BarNo]
    ,[BarTotal]
    ,[ShapeCode]
    ,[ShapeImage]
    ,(SELECT CASE WHEN DimA <> 0 THEN 'A=' + CONVERT(VARCHAR, CAST(DimA AS 
   Decimal(18, 0))) 
    ELSE '' END + CASE WHEN DimB <> 0 THEN 
        ', B=' + CONVERT(VARCHAR, CAST(DimB AS Decimal(18, 0)))
    ELSE '' END + CASE WHEN DimC <> 0 THEN 
        ', C=' + CONVERT(VARCHAR, CAST(DimC AS Decimal(18, 0))) 
    ELSE '' END + CASE WHEN DimD <> 0 THEN 
        ', D=' + CONVERT(VARCHAR, CAST(DimD AS Decimal(18, 0))) 
    ELSE '' END + CASE WHEN DimE <> 0 THEN 
        ', E=' + CONVERT(VARCHAR, CAST(DimE AS Decimal(18, 0))) 
    ELSE '' END + CASE WHEN DimF <> 0 THEN 
        ', F=' + CONVERT(VARCHAR, CAST(DimF AS Decimal(18, 0))) 
    ELSE '' END + CASE WHEN DimG <> 0 THEN 
        ', G=' + CONVERT(VARCHAR, CAST(DimG AS Decimal(18, 0))) 
    ELSE '' END + CASE WHEN DimN <> 0 THEN 
        ', N=' + CONVERT(VARCHAR, CAST(DimN AS Decimal(18, 0))) 
    ELSE '' END) AS Dimension
    ,[DimA]
    ,[DimB]
    ,[DimC]
    ,[DimD]
    ,[DimE]
    ,[DimF]
    ,[DimG]
    ,[DimN]
    ,[Remark]
    ,[Active]
    ,[CreatedDtTm]
    ,[CreatedBy]
    ,[CreatedIp]
    ,[UpdatedDtTm]
    ,[UpdatedBy]
    ,[UpdatedIp]
   FROM BAR_SCHEDULE_DETAIL WHERE Active = 1 AND BarId = @BarId 

如何根据 TypeSize、Shape Code 对它们进行分组。我想包含 group by 语句,但收到此错误消息。 列 'BAR_SCHEDULE_DETAIL.BarDetailId' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中

【问题讨论】:

    标签: sql function group-by grouping sql-server-2016


    【解决方案1】:
    GROUP BY
    

    在像

    这样的聚合函数中使用

    sum(), count(), min(), max(), avg()

    如果要将记录组合​​在一起,则每列都必须是记录的一部分

    GROUP BY

    子句,或使用上述函数之一以某种方式聚合。更多信息可以在这里找到:

    http://www.sqlcourse2.com/agg_functions.html

    我怀疑您可能的意思是您希望结果排序以便记录组在一起,并且您可能正在寻找

    ORDER BY

    条款。

    如果您只想要之前评论过的列的所有组合,查询将如下所示:

    SELECT DISTINCT , 
        [TypeSize] , 
        [ShapeCode] , 
        CASE 
            WHEN dima <> 0 THEN 
                 'A=' + CONVERT(varchar, cast(dima AS decimal(18, 0)))
            ELSE '' 
          END + 
            CASE 
                WHEN dimb <> 0 THEN 
                   ', B=' + CONVERT(varchar, cast(dimb AS decimal(18, 0)))
                ELSE '' 
            END + 
            CASE 
                WHEN dimc <> 0 THEN 
                   ', C=' + CONVERT(varchar, cast(dimc AS decimal(18, 0)))
                ELSE '' 
            END + 
            CASE 
                WHEN dimd <> 0 THEN 
                   ', D=' + CONVERT(varchar, cast(dimd AS decimal(18, 0)))
                ELSE '' 
            END + 
            CASE 
                WHEN dime <> 0 THEN 
                   ', E=' + CONVERT(varchar, cast(dime AS decimal(18, 0)))
                ELSE '' 
            END + 
            CASE 
                WHEN dimf <> 0 THEN 
                   ', F=' + CONVERT(varchar, cast(dimf AS decimal(18, 0)))
                ELSE '' 
            END + 
            CASE 
                WHEN dimg <> 0 THEN 
                   ', G=' + CONVERT(varchar, cast(dimg AS decimal(18, 0)))
                ELSE '' 
            END + 
            CASE 
                WHEN dimn <> 0 THEN 
                   ', N=' + CONVERT(varchar, cast(dimn AS decimal(18, 0)))
                ELSE '' 
            END
          AS dimension 
    FROM            bar_schedule_detail 
    WHERE           active = 1 
    AND             barid = @BarId    
    

    为了包含“热门评论”,如果这意味着发布的第一条评论 - 那么这样的事情就可以做到:

    select a.*, b.remark from 
    (
        SELECT
            [TypeSize] , 
            [ShapeCode] , 
            CASE 
                WHEN c.dima <> 0 THEN 
                     'A=' + CONVERT(varchar, cast(c.dima AS decimal(18, 0)))
                ELSE '' 
              END + 
                CASE 
                    WHEN c.dimb <> 0 THEN 
                       ', B=' + CONVERT(varchar, cast(c.dimb AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN c.dimc <> 0 THEN 
                       ', C=' + CONVERT(varchar, cast(c.dimc AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN c.dimd <> 0 THEN 
                       ', D=' + CONVERT(varchar, cast(c.dimd AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN c.dime <> 0 THEN 
                       ', E=' + CONVERT(varchar, cast(c.dime AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN c.dimf <> 0 THEN 
                       ', F=' + CONVERT(varchar, cast(c.dimf AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN c.dimg <> 0 THEN 
                       ', G=' + CONVERT(varchar, cast(c.dimg AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN c.dimn <> 0 THEN 
                       ', N=' + CONVERT(varchar, cast(c.dimn AS decimal(18, 0)))
                    ELSE '' 
                END
              AS dimension,
              min(c.CreatedDtTm) as CreatedDtTm
        FROM            bar_schedule_detail c
        WHERE           active = 1 
        AND             barid = @BarId    
        GROUP BY
            [TypeSize] , 
            [ShapeCode] , 
            CASE 
                WHEN dima <> 0 THEN 
                     'A=' + CONVERT(varchar, cast(dima AS decimal(18, 0)))
                ELSE '' 
              END + 
                CASE 
                    WHEN dimb <> 0 THEN 
                       ', B=' + CONVERT(varchar, cast(dimb AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN dimc <> 0 THEN 
                       ', C=' + CONVERT(varchar, cast(dimc AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN dimd <> 0 THEN 
                       ', D=' + CONVERT(varchar, cast(dimd AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN dime <> 0 THEN 
                       ', E=' + CONVERT(varchar, cast(dime AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN dimf <> 0 THEN 
                       ', F=' + CONVERT(varchar, cast(dimf AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN dimg <> 0 THEN 
                       ', G=' + CONVERT(varchar, cast(dimg AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN dimn <> 0 THEN 
                       ', N=' + CONVERT(varchar, cast(dimn AS decimal(18, 0)))
                    ELSE '' 
                END
    ) as a, bar_schedule_detail b
    where a.typesize = b.typesize
    and a.shapecode = b.shapecode
    and 
    (
       CASE 
         WHEN b.dima <> 0 THEN 
              'A=' + CONVERT(varchar, cast(b.dima AS decimal(18, 0)))
         ELSE '' 
       END + 
         CASE 
             WHEN b.dimb <> 0 THEN 
                ', B=' + CONVERT(varchar, cast(b.dimb AS decimal(18, 0)))
             ELSE '' 
         END + 
         CASE 
             WHEN b.dimc <> 0 THEN 
                ', C=' + CONVERT(varchar, cast(b.dimc AS decimal(18, 0)))
             ELSE '' 
         END + 
         CASE 
             WHEN b.dimd <> 0 THEN 
                ', D=' + CONVERT(varchar, cast(b.dimd AS decimal(18, 0)))
             ELSE '' 
         END + 
         CASE 
             WHEN b.dime <> 0 THEN 
                ', E=' + CONVERT(varchar, cast(b.dime AS decimal(18, 0)))
             ELSE '' 
         END + 
         CASE 
             WHEN b.dimf <> 0 THEN 
                ', F=' + CONVERT(varchar, cast(b.dimf AS decimal(18, 0)))
             ELSE '' 
         END + 
         CASE 
             WHEN b.dimg <> 0 THEN 
                ', G=' + CONVERT(varchar, cast(b.dimg AS decimal(18, 0)))
             ELSE '' 
         END + 
         CASE 
             WHEN b.dimn <> 0 THEN 
                ', N=' + CONVERT(varchar, cast(b.dimn AS decimal(18, 0)))
             ELSE '' 
         END
    ) = a.dimension
    and a.CreatedDtTm = b.CreatedDtTm
    and b.active = 1 
    and b.barid = @BarId    
    

    从这里开始,如果没有 DDL 的副本和一些行来测试这个答案,它会变得越来越困难,但是如果你想通过一些任意属性来排序,你可以试试这个:

    SELECT DISTINCT , 
        [TypeSize] , 
        [ShapeCode] , 
        CASE 
            WHEN dima <> 0 THEN 
                 'A=' + CONVERT(varchar, cast(dima AS decimal(18, 0)))
            ELSE '' 
          END + 
            CASE 
                WHEN dimb <> 0 THEN 
                   ', B=' + CONVERT(varchar, cast(dimb AS decimal(18, 0)))
                ELSE '' 
            END + 
            CASE 
                WHEN dimc <> 0 THEN 
                   ', C=' + CONVERT(varchar, cast(dimc AS decimal(18, 0)))
                ELSE '' 
            END + 
            CASE 
                WHEN dimd <> 0 THEN 
                   ', D=' + CONVERT(varchar, cast(dimd AS decimal(18, 0)))
                ELSE '' 
            END + 
            CASE 
                WHEN dime <> 0 THEN 
                   ', E=' + CONVERT(varchar, cast(dime AS decimal(18, 0)))
                ELSE '' 
            END + 
            CASE 
                WHEN dimf <> 0 THEN 
                   ', F=' + CONVERT(varchar, cast(dimf AS decimal(18, 0)))
                ELSE '' 
            END + 
            CASE 
                WHEN dimg <> 0 THEN 
                   ', G=' + CONVERT(varchar, cast(dimg AS decimal(18, 0)))
                ELSE '' 
            END + 
            CASE 
                WHEN dimn <> 0 THEN 
                   ', N=' + CONVERT(varchar, cast(dimn AS decimal(18, 0)))
                ELSE '' 
            END
          AS dimension 
    FROM            bar_schedule_detail 
    WHERE           active = 1 
    AND             barid = @BarId    
    

    为了包含“热门评论”,如果这意味着发布的第一条评论 - 那么这样的事情就可以做到:

    select a.*, b.remark from 
    (
        SELECT
            [TypeSize] , 
            [ShapeCode] , 
            CASE 
                WHEN c.dima <> 0 THEN 
                     'A=' + CONVERT(varchar, cast(c.dima AS decimal(18, 0)))
                ELSE '' 
              END + 
                CASE 
                    WHEN c.dimb <> 0 THEN 
                       ', B=' + CONVERT(varchar, cast(c.dimb AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN c.dimc <> 0 THEN 
                       ', C=' + CONVERT(varchar, cast(c.dimc AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN c.dimd <> 0 THEN 
                       ', D=' + CONVERT(varchar, cast(c.dimd AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN c.dime <> 0 THEN 
                       ', E=' + CONVERT(varchar, cast(c.dime AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN c.dimf <> 0 THEN 
                       ', F=' + CONVERT(varchar, cast(c.dimf AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN c.dimg <> 0 THEN 
                       ', G=' + CONVERT(varchar, cast(c.dimg AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN c.dimn <> 0 THEN 
                       ', N=' + CONVERT(varchar, cast(c.dimn AS decimal(18, 0)))
                    ELSE '' 
                END
              AS dimension,
              min(c.CreatedDtTm) as CreatedDtTm
        FROM            bar_schedule_detail c
        WHERE           active = 1 
        AND             barid = @BarId    
        GROUP BY
            [TypeSize] , 
            [ShapeCode] , 
            CASE 
                WHEN dima <> 0 THEN 
                     'A=' + CONVERT(varchar, cast(dima AS decimal(18, 0)))
                ELSE '' 
              END + 
                CASE 
                    WHEN dimb <> 0 THEN 
                       ', B=' + CONVERT(varchar, cast(dimb AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN dimc <> 0 THEN 
                       ', C=' + CONVERT(varchar, cast(dimc AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN dimd <> 0 THEN 
                       ', D=' + CONVERT(varchar, cast(dimd AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN dime <> 0 THEN 
                       ', E=' + CONVERT(varchar, cast(dime AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN dimf <> 0 THEN 
                       ', F=' + CONVERT(varchar, cast(dimf AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN dimg <> 0 THEN 
                       ', G=' + CONVERT(varchar, cast(dimg AS decimal(18, 0)))
                    ELSE '' 
                END + 
                CASE 
                    WHEN dimn <> 0 THEN 
                       ', N=' + CONVERT(varchar, cast(dimn AS decimal(18, 0)))
                    ELSE '' 
                END
    ) as a, bar_schedule_detail b
    where a.typesize = b.typesize
    and a.shapecode = b.shapecode
    and 
    (
       CASE 
         WHEN b.dima <> 0 THEN 
              'A=' + CONVERT(varchar, cast(b.dima AS decimal(18, 0)))
         ELSE '' 
       END + 
         CASE 
             WHEN b.dimb <> 0 THEN 
                ', B=' + CONVERT(varchar, cast(b.dimb AS decimal(18, 0)))
             ELSE '' 
         END + 
         CASE 
             WHEN b.dimc <> 0 THEN 
                ', C=' + CONVERT(varchar, cast(b.dimc AS decimal(18, 0)))
             ELSE '' 
         END + 
         CASE 
             WHEN b.dimd <> 0 THEN 
                ', D=' + CONVERT(varchar, cast(b.dimd AS decimal(18, 0)))
             ELSE '' 
         END + 
         CASE 
             WHEN b.dime <> 0 THEN 
                ', E=' + CONVERT(varchar, cast(b.dime AS decimal(18, 0)))
             ELSE '' 
         END + 
         CASE 
             WHEN b.dimf <> 0 THEN 
                ', F=' + CONVERT(varchar, cast(b.dimf AS decimal(18, 0)))
             ELSE '' 
         END + 
         CASE 
             WHEN b.dimg <> 0 THEN 
                ', G=' + CONVERT(varchar, cast(b.dimg AS decimal(18, 0)))
             ELSE '' 
         END + 
         CASE 
             WHEN b.dimn <> 0 THEN 
                ', N=' + CONVERT(varchar, cast(b.dimn AS decimal(18, 0)))
             ELSE '' 
         END
    ) = a.dimension
    and a.CreatedDtTm = b.CreatedDtTm
    and b.active = 1 
    and b.barid = @BarId    
    ORDER BY
        substring(a.TypeSize,1,1) desc, 
        substring(a.TypeSize,2,len(a.TypeSize)-1) 
    

    【讨论】:

    • 在结果集中,你想要一行代表组,还是想要多行,其中具有相同TypeSize和ShapeCode的信息组彼此相邻?
    • 我想要一行代表该组
    • 你还想要结果集中的什么?除了您分组的列之外,您还想对其余列做什么,隐藏它们?每行有一个总数吗?有每行的平均值吗?
    • “顶级评论”是什么意思?这是否意味着给定 typesize、shapecode 和维度的第一个注释?
    • "top remark" 在 SQL 方面是一个模棱两可的描述。您是指给定属性集的最早时间戳记吗?
    猜你喜欢
    • 2020-09-10
    • 2019-11-08
    • 1970-01-01
    • 2015-03-09
    • 2018-11-03
    • 2021-11-16
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多