簡體   English   中英

MSSQL 聚合(計數)一列,但根據最后匹配行的不同列顯示字符串

[英]MSSQL aggregate (count) one column but show string based on different column from last matching row

我有一張如下表。 每種類型的商品的code永遠不會改變,但可能輸入的description不一致。 由於我們行業的監管要求,無法返回並修復舊數據,但我們已經修復了我們的輸入表單,因此用戶無法輸入錯誤的描述。 換句話說,最近的描述是應該使用的正確描述。

我想計算每個code出現的次數,但我希望它顯示為最近的description

ID 代碼 描述 其他的東西
1 09G 夾克 呸呸
2 270 褲子 呸呸
3 13B T恤 呸呸
4 09G 外套 呸呸
5 09G 毛衣 呸呸
6 13B 襯衫 呸呸

這是我當前的代碼:

SELECT
  TOP 10 code, count(*)
FROM
  table
GROUP BY
  code
ORDER BY
  count(*) DESC

這給了我:

代碼 價值
09G 3
13B 2
270 1

這是正確的,但我希望它顯示最近輸入的描述而不是代碼 - 例如:

代碼 價值
毛衣 3
襯衫 2
褲子 1

以下代碼將使我接近,但它返回按字母順序排列的“last”字符串,不一定是最后輸入的字符串(也就是具有最大id的匹配描述):

SELECT
  MAX(description) as description, count(*)
FROM
  table
GROUP BY
  code
ORDER BY
  count(*) DESC

假設“最近的”意味着“最高的id ”:

;WITH cte AS 
(
  SELECT description, 
         value = COUNT(*) OVER (PARTITION BY code), 
         rn    = ROW_NUMBER() OVER (PARTITION BY code ORDER BY id DESC)
  FROM dbo.[table]
)
SELECT description, value
  FROM cte
  WHERE rn = 1
  ORDER BY value DESC;

結果:

描述 價值
毛衣 3
襯衫 2
褲子 1

這是一種使用 2 個連接在一起的子查詢的方法,但我更喜歡公共表表達式方法。

DECLARE @Data AS TABLE
(
    [id]          INT         NOT NULL,
    [code]        CHAR(3)     NOT NULL,
    [description] VARCHAR(10) NOT NULL
);

INSERT INTO @Data
(
    [id],
    [code],
    [description]
)
VALUES
(1, '09G', 'jacket'),
(2, '270', 'pants'),
(3, '13B', 't-shirt'),
(4, '09G', 'coat'),
(5, '09G', 'sweater'),
(6, '13B', 'shirt');


SELECT [descriptions].[description], [counts].[count]
FROM
       (
           SELECT   [code], COUNT(*) AS [count]
           FROM     @Data AS [d]
           GROUP BY [code]
       ) AS [counts]
       INNER JOIN
       (
           SELECT [ordered].[code], [ordered].[description]
           FROM
                  (
                      SELECT [code],
                             [description],
                             ROW_NUMBER() OVER (PARTITION BY [code]
                                                ORDER BY [id] DESC
                                               ) AS [rn]
                      FROM   @Data
                  ) AS [ordered]
           WHERE  [ordered].[rn] = 1

       ) AS [descriptions]
           ON [descriptions].[code] = [counts].[code];


暫無
暫無

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

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