2017-07-24 70 views
1

我对SQL相当陌生,并且自学了SQL到Khan Academy。我创建一个数据库表如下:在可汗学院的挑战中使用别名和个案陈述时奇怪的表格输出

CREATE TABLE Data_Exp (ID INTEGER PRIMARY KEY AUTOINCREMENT, Subject TEXT, 
         Label TEXT, Gender TEXT, X1 INTEGER, X2 INTEGER, 
         X3 INTEGER, X4 INTEGER, X5 INTEGER); 

INSERT INTO Data_Exp(Subject, Label, Gender, X1, X2, X3, X4, X5) VALUES("S01", "A", "F", 5, 7, 6, 5, 4); 
INSERT INTO Data_Exp(Subject, Label, Gender, X1, X2, X3, X4, X5) VALUES("S02", "B", "M", 8, 8, 6, 4, 6); 
INSERT INTO Data_Exp(Subject, Label, Gender, X1, X2, X3, X4, X5) VALUES("S03", "A", "M", 6, 1, 4, 3, 3); 
INSERT INTO Data_Exp(Subject, Label, Gender, X1, X2, X3, X4, X5) VALUES("S04", "C", "F", 3, 3, 7, 2, 5); 
INSERT INTO Data_Exp(Subject, Label, Gender, X1, X2, X3, X4, X5) VALUES("S05", "B", "F", 9, 2, 5, 3, 7); 

以上代码的输出是:

enter image description here

然后我继续添加以下代码:

SELECT Subject, Gender, Label, ROUND(0.4*X1 + 0.15*(X2+X3+X4+X5),1) AS Y FROM Data_Exp; 

,并得到以下结果(如预期):

enter image description here

然后我用CASE语句来计算列级别

SELECT Subject, Gender, Label, (SELECT CASE WHEN Y > 6 THEN "Level 6" 
    WHEN Y > 5 THEN "Level 5" 
    WHEN Y > 4 THEN "Level 4" 
    WHEN Y > 3 THEN "Level 3" 
    WHEN Y > 2 THEN "Level 2" 
    WHEN Y > 1 THEN "Level 1" 
    END AS "Level" FROM (SELECT ROUND(0.4*X1 + 0.15*(X2+X3+X4+X5),1) AS Y FROM Data_Exp)) AS Level FROM Data_Exp; 

而是获得这样的结果:

enter image description here

我在列级别这种怪异的输出

enter image description here

我在哪里弄错了?

回答

1

因为你正在做某种笛卡儿您的查询将行不通加入

你要找的东西像下面

SELECT Subject, 
Gender, 
Label, 
CASE WHEN ROUND(0.4*X1 + 0.15*(X2+X3+X4+X5),1) > 6 THEN "Level 6" 
    WHEN ROUND(0.4*X1 + 0.15*(X2+X3+X4+X5),1) > 5 THEN "Level 5" 
    WHEN ROUND(0.4*X1 + 0.15*(X2+X3+X4+X5),1) > 4 THEN "Level 4" 
    WHEN ROUND(0.4*X1 + 0.15*(X2+X3+X4+X5),1) > 3 THEN "Level 3" 
    WHEN ROUND(0.4*X1 + 0.15*(X2+X3+X4+X5),1) > 2 THEN "Level 2" 
    WHEN ROUND(0.4*X1 + 0.15*(X2+X3+X4+X5),1) > 1 THEN "Level 1" 
    END AS "Level" 
    FROM Data_Exp; 

的解决方案,否则您可以使用下面的模板。

下面的查询需要修修补补,并可能是繁琐的你正在努力实现

SELECT Subject, 
Gender, 
Label, 
(
    SELECT CASE WHEN Y > 6 THEN "Level 6" 
    WHEN Y > 5 THEN "Level 5" 
    WHEN Y > 4 THEN "Level 4" 
    WHEN Y > 3 THEN "Level 3" 
    WHEN Y > 2 THEN "Level 2" 
    WHEN Y > 1 THEN "Level 1" 
    END AS "Level" 
FROM 
(SELECT ROUND(0.4*X1 + 0.15*(X2+X3+X4+X5),1) AS "Y" FROM Data_Exp) AS "lol" 
INNER JOIN Data_Exp ON Data_Exp.Gender = lol.Gender AND Data_Exp.Label = lol.Label 
) AS "Level" 
FROM 
FROM Data_Exp; 

最后但并非最不重要的,知道你的数据库(PostgresMySql或其他人)将帮助,因为有其他的解决方案就像你可以用来存储你的公式的声明变量一样,这绝对容易。