2015-02-06 51 views
1

我在SQLServer的一个表百万含有x,y行的,z坐标:C#/ SQLServer的:合并行中通过类似于列的表值

X  Y  Z 
2660000 1270000 421.8513 
2660000 1270000 -1415.6297 
2660000 1269960 421.0372 
2660000 1269960 -1415.7926 

有具有相同总是正好两个行x和y坐标。

我希望得到一个表具有以下结构: Xÿ志道(一对中的较大的z值),zbase(较低的z值)。因此,对于具有相同x,y坐标的每一对,结果只包含一行。

我尝试了不同的方法,但迄今为止没有成功。有谁知道如何在C#中或直接在SQL Server中解决这个问题?

+1

你究竟尝试了什么?为什么它不起作用? – SchmitzIT 2015-02-06 11:50:15

回答

0

您需要使用MIN和MAX集合函数来获取顶部和底部z值,然后按x和y列进行分组。

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'coords1') 
    BEGIN 
     DROP TABLE dbo.coords1 
    END 
    GO 

CREATE TABLE coords1 ([x] DECIMAL(12,4), [y] DECIMAL(12,4), [z] DECIMAL(12,4)) 
GO 

INSERT INTO coords1 (x, y, z) 
VALUES(2660000, 1270000, 421.8513), 
(2660000, 1270000, -1415.6297), 
(2660000, 1269960, 421.0372), 
(2660000, 1269960, -1415.7926) 
GO 

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'coords2') 
BEGIN 
    DROP TABLE dbo.coords2 
END 
GO 

CREATE TABLE coords2 ([x] DECIMAL(12,4), [y] DECIMAL(12,4), [ztop] DECIMAL(12,4), [zbase] DECIMAL(12,4)) 
GO 

INSERT INTO coords2 ([x], [y], [ztop], [zbase]) 
SELECT [x], [y], MAX([z]) AS [ztop], MIN([z]) AS [zbase] 
FROM coords1 
GROUP BY x, y 

SELECT * FROM coords2 
+0

非常感谢OTTA和冬青风格!这是我的第一篇文章 - 不知道该如何回答,但现在我阅读了FAQ – svolken 2015-02-06 12:44:01

1

在Oracle中,如下所示,没有GROUP BY子句,聚合函数Max和MIN将应用于整个表,并将它们应用于每个x和y的唯一组合。

SELECT x, y, MAX(z), MIN(z) GROUP by x, y 
+0

哇,那简单!在SQL Server中也很棒!非常感谢! – svolken 2015-02-06 12:02:36

+0

现在从你的目的来讲,礼貌的事情就是把答案标记为正确的,这样我得到声望点;-)。或者你可以给他们霍利,因为她的(?)答案更全面,但我更快。 – OTTA 2015-02-06 12:07:53