Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL Server中按部分列分组_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

如何在SQL Server中按部分列分组

如何在SQL Server中按部分列分组,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我选择了一些列,DATE列是datetime,我只想按收据标题id和收据详细信息项目类别进行分组,但我运行了SQL,得到一个错误。如何成功运行 select DATE as DATE, RECEIPT_ID, CATEGORY1, CATEGORY2, SUM(CEILING(TOTAL_QTY / MEASURE.CONVERSION_QTY)) AS Qty, SUM(ROUND(CEILING(TOTAL_QTY / MEASURE.CONVER

我选择了一些列,
DATE
列是
datetime
,我只想按收据标题id和收据详细信息项目类别进行分组,但我运行了SQL,得到一个错误。如何成功运行

select 
    DATE as DATE, 
    RECEIPT_ID,
    CATEGORY1, CATEGORY2,
    SUM(CEILING(TOTAL_QTY / MEASURE.CONVERSION_QTY)) AS Qty,
    SUM(ROUND(CEILING(TOTAL_QTY / MEASURE.CONVERSION_QTY) * 
        ROUND(MEASURE.LENGTH * MEASURE.WIDTH * MEASURE.HEIGHT/ 1000000.0, 9), 2)) AS cbm
from 
    RECEIPT 
left join 
    MEASURE ON MEASURE.item = RECEIPT.ITEM 
            AND MEASURE.company = RECEIPT.COMPANY
where
    MEASURE.QUANTITY_UM = 'ctn'
group by 
    RECEIPT_ID, CATEGORY1

必须按select子句中的所有非聚合列进行分组。我已修改了您的查询以实现此目的-请参见下文。
如果您只需要按收据ID和类别1进行分组,则无需显示其他两列(日期和类别2),因为它们已合并

   SELECT 
      DATE as DATE, 
      RECEIPT_ID,
      CATEGORY1, 
      CATEGORY2,
      SUM(CEILING( TOTAL_QTY /MEASURE.CONVERSION_QTY )) as Qty,
      SUM(Round( CEILING( TOTAL_QTY /MEASURE.CONVERSION_QTY )* Round( MEASURE.LENGTH * MEASURE.WIDTH * MEASURE.HEIGHT/ 1000000.0, 9 ), 2 )) as cbm
   from RECEIPT 
   left join MEASURE on MEASURE.item = RECEIPT.ITEM AND MEASURE.company = RECEIPT.COMPANY
   WHERE MEASURE.QUANTITY_UM = 'ctn'
  GROUP BY Date, RECEIPT_ID, CATEGORY1, CATEGORY2

如果您没有在
日期
类别2
上分组,请从查询中删除它们:

 select RECEIPT_ID,
   CATEGORY1, 
   SUM(CEILING( TOTAL_QTY /MEASURE.CONVERSION_QTY )) as Qty,
   SUM(Round( CEILING( TOTAL_QTY /MEASURE.CONVERSION_QTY )* Round( MEASURE.LENGTH * MEASURE.WIDTH * MEASURE.HEIGHT/ 1000000.0, 9 ), 2 )) as cbm
   from RECEIPT 
   left join MEASURE on MEASURE.item = RECEIPT.ITEM AND MEASURE.company = RECEIPT.COMPANY
   WHERE MEASURE.QUANTITY_UM = 'ctn'
   group by RECEIPT_ID, CATEGORY1
使用
groupby
SQL时,要求
SELECT
子句中的所有字段为:

  • 在您的
    分组中按
    条款列出,或
  • 包含在聚合函数中(例如,
    MIN
    SUM
    等)

  • 我怀疑您得到的错误是:

     Column 'XXXXX' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
    
    您必须按正在选择的其他列进行分组(除了总和之外),或者执行一些复合查询,以获取所需的数据

          group by DATE, RECEIPT_ID, CATEGORY1, CATEGORY2
    

    无论何时尝试在查询中使用GROUP BY,都必须提及除聚合函数中的列以外的所有其他选定列。因为GROUP BY是基于选择中的其他列生成的。因此,Select子句中不能包含所有列

    根据您发布的需求描述,即您需要根据收据ID和类别1和类别2进行分组。您的查询应如下所示

    select 
       RECEIPT_ID,
       CATEGORY1, 
       CATEGORY2,
       SUM(CEILING( TOTAL_QTY /MEASURE.CONVERSION_QTY )) as Qty,
       SUM(Round( CEILING( TOTAL_QTY /MEASURE.CONVERSION_QTY )* Round( MEASURE.LENGTH * MEASURE.WIDTH * MEASURE.HEIGHT/ 1000000.0, 9 ), 2 )) as cbm
       from RECEIPT 
       left join MEASURE on MEASURE.item = RECEIPT.ITEM AND MEASURE.company = RECEIPT.COMPANY
       WHERE MEASURE.QUANTITY_UM = 'ctn'
       group by RECEIPT_ID, CATEGORY1,CATEGORY2
    

    如果SQL中有聚合函数,则所有非聚合列都必须出现在GROUPBY子句中。作为一种解决方法,您可以使用例如union,因此在第一个SQL子句中您可以这样做


    选择收据\u ID,CATEGORY1
    和总和,在第二次查询中,您得到了其余的列

    您得到了什么错误?CATEGORY2,需要添加到组中,以便您的查询工作。@i空间以及日期(第一个选择的列),因为日期是一个日期时间,您可能需要选择
    转换(日期,[日期])
    和group by
    转换(日期,[date])
    如果您希望按天对记录进行分组,也可以这样做。不能,不将非聚合列分组也没有意义。