将具有多行的sql结果转换为单行

时间:2017-04-06 14:05:19

标签: sql

您好我想将具有多行的sql结果转换为单行 例如 查询

Select  SampleSiteName
      , Altitude
      , Latitude
      , Longitude
From    SampleSite]
Where   SampleSiteID In (Select SampleSiteID
                         From   Sample]
                         Where  projectid = 2453);

返回以下结果

+-------------------------------+----------+-------------+-------------+
|        SampleSiteName         | Altitude |  Latitude   |  Longitude  |
+-------------------------------+----------+-------------+-------------+
| SAVA - Jamena - 02            |       84 | 44.87833333 | 19.08916667 |
| SAVA - Jamena - 03            |       84 | 44.87833333 | 19.08916667 |
| SAVA - Jamena - 04            |       84 | 44.87833333 | 19.08916667 |
| SAVA - Sremska Mitrovica - 02 |       80 | 44.96527778 | 19.60027778 |
| SAVA - Sremska Mitrovica - 03 |       80 | 44.96527778 | 19.60027778 |
| SAVA - Sremska Mitrovica - 04 |       80 | 44.96527778 | 19.60027778 |
| SAVA - Sabac - 01             |       79 | 44.77138889 | 19.70444444 |
| SAVA - Sabac - 02             |       79 | 44.77138889 | 19.70444444 |
| SAVA - Sabac - 03             |       79 | 44.77138889 | 19.70444444 |
| SAVA - Ostruznica - 02        |       78 | 44.72194444 | 20.30416667 |
| SAVA - Ostruznica - 03        |       78 | 44.72194444 | 20.30416667 |
+-------------------------------+----------+-------------+-------------+

我想要一个查询,它会为我返回一个针对Altitude,Latitude和Longitude的每个组合的单行。 我想要的结果是

+---------------------------------+----------+-------------+-------------+
|         SampleSiteName          | Altitude |  Latitude   |  Longitude  |
+---------------------------------+----------+-------------+-------------+
| SAVA - Jamena - 02,             |          |             |             |
| SAVA - Jamena - 03,             |          |             |             |
| SAVA - Jamena - 04              |       84 | 44.87833333 | 19.08916667 |
+---------------------------------+----------+-------------+-------------+
| SAVA - Sremska Mitrovica - 02,  |          |             |             |
| SAVA - Sremska Mitrovica - 03,  |          |             |             |
| SAVA - Sremska Mitrovica - 04   |       80 | 44.96527778 | 19.60027778 |
+---------------------------------+----------+-------------+-------------+
| SAVA - Sabac - 01,              |          |             |             |
| SAVA - Sabac - 02,              |          |             |             |
| SAVA - Sabac - 03               |       79 | 44.77138889 | 19.70444444 |
+---------------------------------+----------+-------------+-------------+
| SAVA - Ostruznica - 02          |          |             |             |
| ,SAVA - Ostruznica - 03         |       78 | 44.72194444 | 20.30416667 |
+---------------------------------+----------+-------------+-------------+

我想要一个通用查询,它将为我提供上述结果。 任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

如果我理解你的结构,应该这样做。

我在SQL SERVER上测试了这个,但你没有表明这个假设。

SELECT 
       Left(Main.SampleN,Len(Main.SampleN)-1) As "SampleN",
       Main.Altitude,Main.Latitude,Main.Longitude
FROM 
   (
        SELECT DISTINCT ST2.Altitude,ST2.Latitude,ST2.Longitude,
           (
                SELECT ST1.SampleSiteName + ',' AS [text()]
                FROM dbo.SampleSite ST1
                WHERE 
                      ST1.Altitude = ST2.Altitude 
                      AND ST1.Latitude = ST2.Latitude 
                      AND ST1.Longitude = ST2.Longitude
                      AND ST1.SampleSiteID in (SELECT SampleSiteID  
                                          FROM Sample 
                                          WHERE Projectid=2453)
                ORDER BY ST1.Altitude,ST1.Latitude,ST1.Longitude
                FOR XML PATH ('')
            ) AS [SampleN]
      FROM dbo.SampleSite AS ST2
       WHERE ST2.SampleSiteID in (SELECT SampleSiteID  
                                          FROM Sample 
                                          WHERE Projectid=2453)
   ) AS [Main]

对于完整的测试列表,我使用了这个:

CREATE TABLE Sample (
  Projectid INT,
  SampleSiteID INT,
);  

CREATE TABLE SampleSite (
 SampleSiteID INT,
 SampleSiteName VARCHAR(35),
 Altitude INT,
 Latitude DECIMAL(18,9),
 Longitude DECIMAL(18,9),
 Projectid INT         
 );
INSERT INTO Sample
VALUES (2453, 1), (2453, 2), (2453, 3), 
      (2453, 4), (2453, 5), (2453, 6), 
      (2453, 7), (2453, 8), (2453, 9), 
      (2453, 10), (2453, 11), (1234, 12);
INSERT INTO SampleSite
VALUES       
(1, 'SAVA - Jamena - 02', 84, 44.87833333 , 19.08916667 ,2453 ),
(2, 'SAVA - Jamena - 03', 84, 44.87833333 , 19.08916667 ,2453 ),
(3, 'SAVA - Jamena - 04', 84, 44.87833333 , 19.08916667 ,2453 ),
(4, 'SAVA - Sremska Mitrovica - 02', 80 ,44.96527778,19.60027778 ,2453 ),
(5, 'SAVA - Sremska Mitrovica - 03', 80 ,44.96527778,19.60027778 ,2453 ),
(6, 'SAVA - Sremska Mitrovica - 04', 80 ,44.96527778,19.60027778 ,2453 ),
(7, 'SAVA - Sabac - 01', 79 , 44.77138889 ,19.70444444 ,2453 ),
(8, 'SAVA - Sabac - 02', 79 , 44.77138889 ,19.70444444 ,2453 ),
(9, 'SAVA - Sabac - 03', 79 , 44.77138889 ,19.70444444 ,2453 ),
(10, 'SAVA - Ostruznica - 02', 78 ,44.72194444 ,20.30416667 ,2453 ),
(11, 'SAVA - Ostruznica - 03', 78 ,44.72194444 ,20.30416667 ,2453 ),
(12, 'SAVA - test - 04', 79 ,44.38822842 ,20.12345678 ,1234 );


SELECT 
       Left(Main.SampleN,Len(Main.SampleN)-1) As "SampleN",
       Main.Altitude,Main.Latitude,Main.Longitude
FROM 
   (
        SELECT DISTINCT ST2.Altitude,ST2.Latitude,ST2.Longitude,
           (
                SELECT ST1.SampleSiteName + ',' AS [text()]
                FROM dbo.SampleSite ST1
                WHERE 
                      ST1.Altitude = ST2.Altitude 
                      AND ST1.Latitude = ST2.Latitude 
                      AND ST1.Longitude = ST2.Longitude
                      AND ST1.SampleSiteID in (SELECT SampleSiteID  
                                          FROM Sample 
                                          WHERE Projectid=2453)
                ORDER BY ST1.Altitude,ST1.Latitude,ST1.Longitude
                FOR XML PATH ('')
            ) AS [SampleN]
      FROM dbo.SampleSite AS ST2
       WHERE ST2.SampleSiteID in (SELECT SampleSiteID  
                                          FROM Sample 
                                          WHERE Projectid=2453)
   ) AS [Main]