Sql server 在SQL server Group by中获取相同的值一次。
我想写一个分组查询,在这里我只需要一次相同的值,有可能吗 我的问题Sql server 在SQL server Group by中获取相同的值一次。,sql-server,Sql Server,我想写一个分组查询,在这里我只需要一次相同的值,有可能吗 我的问题 SELECT NAME, SUM(SALARY) FROM CUSTOMERS GROUP BY NAME; 输出: +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh
SELECT NAME, SUM(SALARY) FROM CUSTOMERS GROUP BY NAME;
输出:
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Ramesh | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | kaushik | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Hardik | 22 | MP | 4500.00 |
| 7 | Hardik | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
预期产出:
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | | 22 | MP | 4500.00 |
| 7 | | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
您可以按如下方式使用行号:
Select Id, Case when (row_number() over (partition by Name order by Id) = 1) then [Name] else NULL end as [Name], Age, Address, Salary
from yourtable
首先,如果是针对UI,那么操纵UI中的数据使其以您想要的方式显示通常是一种好的做法 此外,您的结果集甚至不是
groupbyname
子句的结果。如果没有某种类型的聚合
或最大最小值
,你怎么能拥有年龄、地址、Id
无论如何,如果你想以你在问题中所展示的方式实现它,一种方法是:
CREATE TABLE #myTable
(Id INT, FullName VARCHAR(200) NULL, age INT, salary DECIMAL);
INSERT INTO #myTable (Id, FullName, age, salary)
VALUES (1, 'anc', 5, 1500),
(2, 'anc', 15, 1000),
(3, 'defc', 25, 12000),
(4, 'defc', 45, 15000);
--mark with row_number and load into a temp table
SELECT mt.Id,
mt.FullName,
mt.age,
mt.salary,
ROW_NUMBER() OVER (PARTITION BY mt.FullName ORDER BY mt.age) AS RowNum
INTO #t1
FROM #myTable AS mt;
-- update any non-first row
UPDATE t
SET t.FullName = NULL
FROM #t1 AS t
WHERE t.RowNum != 1;
--select from tempTable
SELECT t.Id,
t.FullName,
t.age,
t.salary
FROM #t1 AS t;
这实际上非常简单-SQL Server支持
LAG
,它访问前一行。因此,您只需说“当最后一行的名称与此行的名称相同时,请将名称留空-否则,请使用名称”:
另外,正如你所看到的,您需要在
GROUP BY
子句中包含所有非聚合函数的列-因此您需要添加Age
和Address您的查询无法提供您发布的输出该输出仅在UI中有用,以便对其进行格式化。您的结果集甚至不是GROUP BY BY Name的结果条款如果没有某种聚合或最大-最小值,你怎么能有年龄、地址、Id?
SELECT CASE WHEN LAG(Name) OVER(ORDER BY ID) = Name THEN '' ELSE Name END AS [Name],
Age,
Address,
SUM(SALARY) AS [Salary]
FROM Customers
GROUP BY Name, Age, Address