SUM(COUNT(列)* AVG(列))AS列

时间:2016-08-22 00:05:48

标签: mysql sql hadoop

我在csv上使用hadoop来分析一些数据。我使用sql / mysql(不确定)来分析数据,现在我正处于冲动状态。

我花了几个小时的谷歌搜索,却没有找到任何与之相关的东西。我需要一个查询,我可以计算一列和列的总和或平均值,并将它们相互相乘。

这不起作用:

SELECT model, 
       brand, 
       COUNT(model) AS ModelCount, 
       AVG(distance) AS DistanceAvg, 
       // OR SUM(distance) AS DistanceSum 
       // SUM(ModelCount * DistanceAvg) AS Total
       // SUM(ModelCount * DistanceSum) AS Total 
       // SUM(COUNT(model)*AVG(distance)) AS Total
       // SUM(COUNT(model)*SUM(distance)) AS Total
       // None of the commented lines work
FROM cars 
WHERE type = 'M1' OR type = 'M1G' 
GROUP BY model, brand 
ORDER BY ModelCount DESC;

其余的代码工作得很好,但没有一个评论的解决方案有效。谷歌搜索的时间,没有运气。

似乎有些问题需要了解我的目标,我需要弄清楚的是如何通过将计数值乘以平均值得到结果如下:

SUM(COUNT(model)*AVG(distance)) AS TOTAL

我想计算模型以找出它们中有多少存在,这样可以正常工作。然后我希望得到所有汽车的模型平均距离,这是我通过运作得到的。然后,我希望查询将汽车数量乘以这些特定汽车的平均距离。

我可以获得我需要的值并手动计算值,我只是希望有一种方法可以跳过手动计算这个,因为这是一个巨大的工作要做这个规模。这个列表中有500万辆汽车,我不能在这些条件下手动工作。

不确定这是否有帮助,但是继续工作查询,我需要添加:

SELECT mallimerkinta, 
       merkkiSelvakielinen, 
       COUNT(mallimerkinta) AS Suosituinmalli, 
       ROUND(AVG(CAST(matkamittarilukema AS FLOAT)),0) AS Keskilukema   
FROM ajoneuvot 
WHERE ajoneuvoluokka = 'M1' OR ajoneuvoluokka = 'M1G' 
GROUP BY mallimerkinta, merkkiSelvakielinen 
HAVING COUNT(mallimerkinta) > '4659' 
ORDER BY Keskilukema DESC; 

以下是它产生的结果:

mallimerkinta   merkkiselvakielinen     suosituinmalli  keskilukema

4D COROLLA 1.6XLI-AE101L-AEMDKW/247     Toyota  4715    267686.0

5D MONDEO STW 1.8-BWY/275   Ford    6021    226086.0

5D FOCUS STW 1.6-DNW/262    Ford    10571   216980.0

5D GOLF VARIANT 1.6-1J/250  Volkswagen  13136   200201.0

V70 Farmari (AC) 4ov 2400cm3 A  Volvo   5912    198062.0

4D FOCUS HATCHBACK 1.6-DAW/262  Ford    5899    197925.0

4D BORA SEDAN 1.6-1J/250    Volkswagen  4660    180550.0

5D COROLLA STW 1.6-ZZE121L-DWMDKW/260   Toyota  4999    180221.0

5D COROLLA STW 1.6-ZZE121L-DWMNKW/260   Toyota  4990    176687.0

4D ALMERA SEDAN 1.5-BAAN16/254  Nissan  8421    156514.0

XC60 Farmari (AC) 4ov 2400cm3 A     Volvo   7900    113591.0

GOLF Farmari (AC) 4ov 1390cm3   Volkswagen  6215    87724.0

FOCUS Farmari (AC) 4ov 1596cm3  Ford    5063    86598.0

GOLF Farmari (AC) 4ov 1390cm3 A     Volkswagen  5634    83164.0

CEED Monik�ytt�ajoneuvo (AF) 4ov 1591cm3    Kia     5191    78059.0

TOYOTA AVENSIS Monik�ytt�ajoneuvo (AF) 4ov 1798cm3  Toyota  6384    68166.0

NISSAN QASHQAI Monik�ytt�ajoneuvo (AF) 4ov 1598cm3  Nissan  10595   59330.0

FIESTA Viistoper� (AB) 4ov 1242cm3  Ford    5631    58837.0

TOYOTA AURIS Monik�ytt�ajoneuvo (AF) 4ov 1798cm3    Toyota  5558    56878.0

TOYOTA YARIS Monik�ytt�ajoneuvo (AF) 4ov 1329cm3    Toyota  11829   40348.0

我需要suosituinmalli乘以keskilukema作为额外的专栏。

1 个答案:

答案 0 :(得分:0)

SELECT mallimerkinta, 
       merkkiSelvakielinen, 
       COUNT(mallimerkinta) AS Suosituinmalli, 
       ROUND(AVG(CAST(matkamittarilukema AS FLOAT)),0) AS Keskilukema,
      COUNT(mallimerkinta) * ROUND(AVG(CAST(matkamittarilukema AS FLOAT)),0) AS DesiredColumn
FROM ajoneuvot 
WHERE ajoneuvoluokka = 'M1' OR ajoneuvoluokka = 'M1G' 
GROUP BY mallimerkinta, merkkiSelvakielinen 
HAVING COUNT(mallimerkinta) > '4659' 
ORDER BY Keskilukema DESC; 

也可以这样完成:

SELECT
    t.*
    ,t.Suosituinmalli * t.Keskilukema AS DesiredColumn
FROM
    (
       SELECT mallimerkinta, 
            merkkiSelvakielinen, 
            COUNT(mallimerkinta) AS Suosituinmalli, 
            ROUND(AVG(CAST(matkamittarilukema AS FLOAT)),0) AS Keskilukema,
       FROM ajoneuvot 
       WHERE ajoneuvoluokka = 'M1' OR ajoneuvoluokka = 'M1G' 
       GROUP BY mallimerkinta, merkkiSelvakielinen 
       HAVING COUNT(mallimerkinta) > '4659' 
    ) t
ORDER BY Keskilukema DESC; 

其他人在评论中说的是,您不能在另一个动态列的定义中使用列别名。因此,在上面的示例中,您声明SUM(ModelCount * DistanceAvg)ModelCountDistanceAvg是同一选择语句的列别名,因此它们不能像那样引用,但您可以完成(COUNT(MODEL) * AVG(DISTANCE))。因此,有两种方法可以解决问题:重复您要在新列定义中引用的列的定义,例如第一个示例。或者第二种是你可以将你的select语句转换为子选择。然后外部选择将理解您的列别名,并允许您在新动态列的定义中使用它们。