您好我想将具有多行的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 |
+---------------------------------+----------+-------------+-------------+
我想要一个通用查询,它将为我提供上述结果。 任何帮助将不胜感激
答案 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]