簡體   English   中英

SQL Group BY SUM一列並選擇第一行的分組項

[英]SQL Group BY SUM one column and select of first row of grouped items

我有一個零件表,我有5個字段。 我想要顯示mfgpn的QTY,同時顯示其他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

這可以通過窗口 SUM()輕松管理:

WITH summed_and_ranked AS (
  SELECT
    MFGPN,
    MANUFACTURER,
    DATECODE,
    DESCRIPTION,
    QTY = SUM(QTY) OVER (PARTITION BY MFGPN),
    RNK = ROW_NUMBER() OVER (
      PARTITION BY MFGPN
      ORDER BY DATECODE  -- or which column should define the order?
    )
  FROM atable
)
SELECT
  MFGPN,
  MANUFACTURER,
  DATECODE,
  DESCRIPTION,
  QTY,
INTO parts
FROM summed_and_ranked
WHERE RNK = 1
;

對於每一行,計算組中的總組數量和排名。 當實際獲取用於插入新表(主SELECT)的行時,僅拉取RNK值為1的行。 因此,您將獲得包含組總計的結果集以及某些行的詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM