Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL server Group by中获取相同的值一次。_Sql Server - Fatal编程技术网

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