2017-08-02 69 views
0

我选择了一些列,DATE列是datetime,我想只按收到标题的id和收到明细项目类别进行分组,但我运行的是SQL,我得到一个错误。如何成功运行?如何在SQL Server中按部分列进行分组

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 
+0

你得到什么错误? – Becuzz

+0

CATEGORY2需要添加到群组中,以便您的查询能够正常工作。 – isaace

+0

@isaace以及日期(第一次选择的列) – Eli

回答

1

必须组由所有非聚合列这是你的选择条款的一部分。我修改了你的查询来做到这一点 - 请参阅下文。
如果您只需要RECEIPT_ID和category1,需要GROUP BY,则不需要显示其他两列(日期和类别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 
0

如果你没有上进行分组DATECategory2,从查询中删除:

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 

当使用GROUP BY SQL要求你SELECT条款各个领域要么是:

  1. 列入您的GROUP BY条款或
  2. Containe聚合函数(例如,MINSUM等)
0

我怀疑你所得到的错误里面d是:

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其他列要从资金选择(除),或者做一些复合查询,以获得您所需要

 group by DATE, RECEIPT_ID, CATEGORY1, CATEGORY2 
0

每当你尝试使用GROUP BY在你查询你必须提到的所有其他列选择比那些在你公司的其他数据GREGATE函数.Coz,GROUP BY基于选择中的其他列进行。因此,您不能在Select CLAUSE中包含所有列。

按照您发布的需求描述,即需要通过RECEIPT_ID CATEGORY2组和CATEGORY1和您的查询应该像下面

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 
0

如果你有聚合函数在SQL中,所有的非集合列必须出现在group by子句中。作为变通,您可以在第一次SQL子句中使用,例如工会,这样你就

SELECT RECEIPT_ID, CATEGORY1和资金,并在第二查询你列的其余

相关问题