计算 SQL 中加入的 table 中的前缀

Counting prefixes in a joined table in SQL

我正在计算一个人拥有多少牌子的汽车。汽车品牌仅由我的链接中的前缀定义 table。

Table 1 (Person)
UniqueID         Name
PER0001          Adrian
PER0002          Michael
Per0003          James

Table 2 (Links)
UniqueID         LinkEnd1_ID         LinkEnd2_ID
LIN0001          PER0001             FER02332
LIN0002          PER0001             FER02112
LIN0003          PER0001             POR12122
LIN0004          PER0002             FER12321
LIN0005          PER0003             MAS12382
LIN0006          PER0003             FER22982
LIN0006          PER0003             MAS12232

Output (option 1)
Name             Car_Make           Count
Adrian           FER                2
Adrian           POR                1
Michael          FER                1
James            MAS                2
James            FER                1

Output (option 2 - preferred)
Name             FER           POR            MAS
Adrian           1             2
Michael          1
James            1                            2

我使用 link table 来计算汽车制造数量的原因是因为每个汽车制造商都有不同的 table 我需要加入。

我试过了

select count left(LinkEnd2_ID,3) 没用,我也尝试过我似乎无法破解的组。

我想我想做的是

select 
  count(left(LinkEnd2_ID,3)='FER'
  ,count(left(LinkEnd2_ID,3)='POR'
  ,count(left(LinkEnd2_ID,3)='MAS'

但那是 select 中的一个查询,我破译了如何正确编码。

这里是我的出发点(或者说我不断回去重新开始的基地)-

SELECT 
  Person.Unique_ID
  ,Person.Name
  ,left(Link.LinkEnd2_ID,3) as Car_Make
FROM
  Person
LEFT JOIN
  Links as Link
  on Person.Unique_ID = Link.LinkEnd1_ID

如能提供任何帮助,我们将不胜感激。

差不多了,你只需要添加一个分组依据,并将所有列更改为聚合函数。

您的选项 1:

SELECT 
  max(Person.Name) as Person_Name
  ,left(Link.LinkEnd2_ID,3) as Car_Make
  ,count(*) as No_of_Car
FROM
  Person
LEFT JOIN
  Links as Link
  on Person.Unique_ID = Link.LinkEnd1_ID
GROUP BY
   Person.Unique_ID

对于选项 2,您需要将聚合函数包裹在 case 语句中

您必须对 3 种不同的汽车品牌进行硬编码,因此如果您不知道它们的数量,它将无法工作。

SELECT 
  max(Person.Name) as Person_Name
  ,sum(case when left(Link.LinkEnd2_ID,3) ='FER' then 1 else 0 end) as FER
  ,sum(case when left(Link.LinkEnd2_ID,3) ='POR' then 1 else 0 end) as POR
  ,sum(case when left(Link.LinkEnd2_ID,3) ='MAS' then 1 else 0 end) as MAS
FROM
  Person
LEFT JOIN
  Links as Link
  on Person.Unique_ID = Link.LinkEnd1_ID
GROUP BY
   Person.Unique_ID