如何在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])
如果您希望按天对记录进行分组,也可以这样做。不能,不将非聚合列分组也没有意义。