来自WHERE的SQL多个AS列

问题描述 投票:-1回答:3

我有一张桌子

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

最好的柏林Joerg

sql select google-bigquery where
3个回答
0
投票

我想你想聚合:

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;

0
投票

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
投票

谢谢你的帮助!根据Gordon Linhoff的回答,我得到了这个解决方案:

SELECT max(city ='berlin'然后名称结束时的情况)为berlin,max(当city ='munich'然后名称结束时的情况)为munich FROM TABLE WHERE年龄= 42;

© www.soinside.com 2019 - 2024. All rights reserved.