SQL Group BY SUM 一列并选择分组项目的第一行

标签 sql sql-server sql-server-2008

我有一个零件表,其中有 5 个字段。我想对 mfgpn 的数量求和,同时显示其他 3 个字段(Manfucturer、DateCode、Description)的第一个返回行。我最初想如下使用 MIN 函数,但就数据不是 int 数据类型而言,这并没有真正帮助我。我该怎么做呢?现在我被困在以下查询中:

SELECT SUM([QTY]) AS QTY
  ,[MFGPN]
  ,MIN([MANUFACTURER]) AS MANUFACTURER
  ,MIN([DATECODE]) AS DateCode
  ,MIN([DESCRIPTION]) AS DESCRIPTION
  INTO part
GROUP BY MFGPN, MANUFACTURER, DATECODE, description
ORDER BY mfgpn ASC

最佳答案

CROSS APPLY为你工作?

SELECT 
    SUM(a.[QTY]) AS QTY
    ,a.[MFGPN]
    ,c.[MANUFACTURER]
    ,c.[DATECODE]
    ,c.[DESCRIPTION]
FROM part a
    CROSS APPLY (SELECT TOP 1 * FROM part b WHERE a.[MFGPN] = b.[MFGPN]) c
GROUP BY 
    a.[MFGPN]
    ,c.[MANUFACTURER]
    ,c.[DATECODE]
    ,c.[DESCRIPTION]

测试如下:
DECLARE @T1 AS TABLE (
    [QTY] int
    ,[MFGPN] NVARCHAR(50)
    ,[MANUFACTURER] NVARCHAR(50)
    ,[DATECODE] DATE
    ,[DESCRIPTION] NVARCHAR(50));

INSERT @T1 VALUES
(2, 'MFGPN-1', 'MANUFACTURER-A', '20120101', 'A-1'),
(4, 'MFGPN-1', 'MANUFACTURER-B', '20120102', 'B-1'),
(3, 'MFGPN-1', 'MANUFACTURER-C', '20120103', 'C-1'),
(1, 'MFGPN-2', 'MANUFACTURER-A', '20120101', 'A-2'),
(5, 'MFGPN-2', 'MANUFACTURER-B', '20120101', 'B-2')

SELECT 
    SUM(a.[QTY]) AS QTY
    ,a.[MFGPN]
    ,c.[MANUFACTURER]
    ,c.[DATECODE]
    ,c.[DESCRIPTION]
FROM @T1 a
    CROSS APPLY (SELECT TOP 1 * FROM @T1 b WHERE a.[MFGPN] = b.[MFGPN]) c
GROUP BY 
    a.[MFGPN]
    ,c.[MANUFACTURER]
    ,c.[DATECODE]
    ,c.[DESCRIPTION]

生产
QTY MFGPN   MANUFACTURER    DATECODE    DESCRIPTION
9   MFGPN-1 MANUFACTURER-A  2012-01-01  A-1
6   MFGPN-2 MANUFACTURER-A  2012-01-01  A-2

关于SQL Group BY SUM 一列并选择分组项目的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11622391/

相关文章:

php - 好奇的 Mysql 更新错误

mysql - 即使我在查询中使用了所有索引列,为什么不使用多列索引?

C# SqlCommand.ExecuteNonQuery 对于成功的 UPDATE SQL 语句返回 -1

sql-server - 使用备份/还原在同一台计算机内创建数据库副本会引发错误 :- The backup set holds a backup of a database

sql - SSIS 用户定义类型

mysql - 选择计数、分组依据并进行优化

sql - 如何在SQL的where子句中调用存储过程

sql-server - 撤消表分区

sql-server - 基于 XML 的查询通过 ADO.NET 极其缓慢,通过 SSMS 即时

sql - 如何计算总小时数