Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL交叉连接_Sql_Join - Fatal编程技术网

使用SQL交叉连接

使用SQL交叉连接,sql,join,Sql,Join,我有一个表格,其中包含调查数据,两个数据点是种族和风味。 Flavor_Pref包含一个整数1、2、3、4、5。1=非常不喜欢,5=非常喜欢 Ethnicity Flavor_Pref African American 3 Caucasian 2 Asian 4 Hispanic 1 African American 3 Cauc

我有一个表格,其中包含调查数据,两个数据点是种族和风味。 Flavor_Pref包含一个整数1、2、3、4、5。1=非常不喜欢,5=非常喜欢

 Ethnicity            Flavor_Pref
 African American         3
 Caucasian                2
 Asian                    4
 Hispanic                 1
 African American         3
 Caucasian                4
 Asian                    5
 Hispanic                 2
 African American         4
 Caucasian                1
 Asian                    4
 Hispanic                 2
 African American         3
 Caucasian                2
 Asian                    2
 Hispanic                 1
我想运行一个查询,得到4列,每个民族一列。每组都有不同数量的回答

这就是我正在做的:我得到了100多万个结果。。。。我只有400份调查

  select  AA.Flavor_Pref as AA,H.Flavor_Pref as H,C.Flavor_Pref AS C,
  A.Flavor_Pref AS A  from
  (SELECT ETHNICITY,Flavor_Pref FROM FLAVORS WHERE ETHNICITY = 'AFRICAN AMERICAN')AS AA
  CROSS JOIN
  (SELECT ETHNICITY,Flavor_Pref FROM FLAVORS WHERE  ETHNICITY = 'HISPANIC') AS H
  CROSS JOIN 
  (SELECT ETHNICITY,Flavor_Pref FROM FLAVORS WHERE ETHNICITY = 'CAUCASIAN') AS C
  CROSS JOIN 
  (SELECT ETHNICITY,Flavor_Pref FROM FLAVORS WHERE  ETHNICITY = 'ASIAN' ) AS A
我要寻找的是:在这种情况下,西班牙裔的结果较少,因此没有任何报道

   African Americans            Hispanic        Caucasian          Asian
         3                         1                2               4
         3                         2                4               5
         4                         2                1               5
         .                         .                .               .
         .                         .                .               .
         .                         .                .               .
         3                                          2               4
         2                                          1               1  

您要查找的是将行透视到列。以下是执行此操作的标准方法,它将适用于所有RDBMS:

SELECT 
  MAX(CASE WHEN Ethnicity = 'African American' THEN Flavor_Pref END)
     AS 'African Americans',
  MAX(CASE WHEN Ethnicity = 'Hispanic' THEN Flavor_Pref END)
     AS 'Hispanic',
  MAX(CASE WHEN Ethnicity = 'Caucasian' THEN Flavor_Pref END)
     AS 'Caucasian',
  MAX(CASE WHEN Ethnicity = 'Asian' THEN Flavor_Pref END)
     AS 'Asian'
FROM @flavors 
GROUP BY Flavor_Pref

你想要每个种族最流行的口味。您可以在大多数数据库中使用排名函数执行此操作:

select max(case when ethnicity = 'African American' and seqnum = 1 then flavor_pref end) as AfricanAmerican,
       max(case when ethnicity = 'Hispanic' and seqnum = 1 then flavor_pref end) as Hispanic,
       max(case when ethnicity = 'Caucasian' and seqnum = 1 then flavor_pref end) as Caucasian,
       max(case when ethnicity = 'Asian' and seqnum = 1 then flavor_pref end) as Asian
from (select t.ethnicity, t.flavor_pref, cnt,
             row_number() over (partition by t.enthnicity order by cnt desc) as seqnum
      from (select t.ethnicity, t.flavor_pref, count(*) as cnt
            from t
            group by t.ethnicity, t.flavor_pref
           ) t
     ) ts