SQL несколько столбцов AS от ГДЕ - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть таблица

name | age | city
-------------
joe | 42 | berlin
ben | 42 | munich
anna | 22 | hamburg
pia | 50 | berlin
georg | 42 | munich
lisa | 42 | berlin

Теперь я хотел бы получить все 42 года в разных столбцах по городам

berlin | munich
-------------
joe | ben
lisa | georg

Так что мне нужно что-то вроде

SELECT (
SELECT  name AS berlin WHERE city = "berlin"
UNION
SELECT name AS munich WHERE city = "munich")
FROM TABLE
WHERE
age = 42

Лучший из Берлина Йорг

Ответы [ 3 ]

0 голосов
/ 24 апреля 2019

Используя PIVOT , например, я сделал это с SQL Server. Надеюсь, это поможет вам.

DECLARE @columns varchar(MAX);
DECLARE @sql nvarchar(max)
CREATE TABLE #Table
(
idPerson int,
firstName varchar(10),
age int,
city varchar(10)
);

INSERT INTO #Table
SELECT '1', 'joe', '42','berlin' UNION ALL
SELECT '2', 'ben', '42','munich' UNION ALL
SELECT '3', 'Ana', '22','hamburg' UNION ALL
SELECT '4', 'pia', '50','berlin' UNION ALL
SELECT '5', 'george', '42','munich' UNION ALL
SELECT '6', 'lisa', '42','munich'



--SELECT * from #Table

 SET @columns = STUFF(
 (
 SELECT
   ',' + QUOTENAME(LTRIM(city))
 FROM
   (SELECT DISTINCT city
    FROM #Table
   ) AS T
 ORDER BY
 city
 FOR XML PATH('')
 ), 1, 1, '');

 SET @sql = N'
 SELECT
   * 
  FROM
  (  
  SELECT  idPerson ,firstName ,age ,city 
  FROM #Table
    --WHERE age = 42
  ) AS T
  PIVOT   
  (
  MAX(firstName)
  FOR city IN (' + @columns + N')
  ) AS P order by age;'; 

EXEC sp_executesql @sql;
DROP TABLE #Table;
0 голосов
/ 24 апреля 2019

Спасибо за вашу помощь! На основании ответа Гордона Линхоффа я получил это решение:

SELECT max (случай, когда city = 'berlin', затем имя end) как berlin, max (случай, когда city = 'munich', затем имя end) как munich ИЗ ТАБЛИЦЫ ГДЕ возраст = 42 ;

0 голосов
/ 24 апреля 2019

Я думаю, что вы хотите агрегации:

select max(case when city = 'berlin' then name end) as berlin,
       max(case when city = 'munich' then name end) as munich
from (select t.*, row_number() over (partition by city order by name) as seqnum
      from t
      where city in ('berlin', 'munich') and age = 42
     ) t
group by seqnum
order by seqnum;
...