[英]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.