2015-02-06 49 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