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