在SQL Server Group by中获取一次相同的值。

时间:2017-07-20 16:52:07

标签: sql-server

我想通过查询来编写组,其中我只想要一次相同的值吗?

我的查询

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 |
+----+----------+-----+-----------+----------+

3 个答案:

答案 0 :(得分:1)

您可以使用如下的row_number:

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

答案 1 :(得分:0)

首先,如果是UI用户,通常最好在UI中操作数据以按照您想要的方式显示。

此外,您的结果集甚至不是group by Name子句的结果。如果没有某种Age, Address, Idaggregation

,你怎么能max min

无论如何,如果你想按照你在问题中所表达的方式来实现它,那么实现的方法之一就是:

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;

答案 2 :(得分:0)

这实际上非常简单 - SQL Server支持LAG,它访问上一行。所以,您只需要说“当最后一行的名称与此行的名称相同时,请将名称留空 - 否则,请使用名称”:

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

另外,如您所见,您需要在GROUP BY子句中包含非聚合函数的所有列 - 因此您需要添加AgeAddress