SQL通过分隔符计算不同的值

时间:2014-06-10 20:57:54

标签: sql r sqlite aggregation

我的数据集如下:

   Fruit Quantity 
    apple 1/2
    apple 2/2
    apple 2/2
    orange 1/3
    orange 1/1
    orange 2/10
    grape 4/10`

第一个数字是指每个水果所在的箱子。这是一个庞大的数据集,我想要一个可以汇总每个水果有多少箱子的sql代码。

我尝试过许多不同的方法,但无法识别数据集中的第一个数字。我也试过很多r包,包括ply和data.table来解决这个问题,但没有运气,但是使用这些工具或任何其他r包的任何想法都会受到赞赏。

有什么想法吗?

澄清 我想要的输出看起来像这样

fruit count
apple 2
orange 2
grape 1

使用sqlite寻找答案

3 个答案:

答案 0 :(得分:0)

你可以使用字符串操作来获取字符串的一部分,然后在水果上分组,并确定有多少不同的包装箱数。

对于字段为ShippingRecords的表Shipping,该表为:

select Fruit, count(distinct Crate)
from (
  select
    Fruit = left(Shipping, charindex(' ', Shipping) - 1),
    Crate = substring(Shipping, charindex(' ', Shipping) + 1, charindex('/', Shipping) - charindex(' ', Shipping) - 1)
  from ShippingRecords
) y
group by Fruit

结果:

apple    2
grape    1
orange   2

SQL小提琴:http://sqlfiddle.com/#!6/0730b/1


如果FruitQuantity是单独的字段,那么它会变得更简单:

select Fruit, count(distinct Crate)
from (
  select
    Fruit,
    Crate = left(Quantity, charindex('/', Quantity) - 1)
  from ShippingRecords
) y
group by Fruit

SQL小提琴:http://sqlfiddle.com/#!6/51bf5/3


编辑:

使用SQLite,您可以使用substrinstr函数:

select Fruit, count(*)
from (
  select distinct
    Fruit,
    Crate = substr(Quantity, 1, instr(Quantity, '/') - 1)
  from ShippingRecords
) y
group by Fruit

答案 1 :(得分:0)

使用左右分别获取名称和分数(如果有水果名称,则使用空格)。然后以相同的方式分割分数。在名为denormalizedFruits的表中假设一个名为fruits的列:

select Fruit
  , left(Crates, charindex('/',Crates) - 1) as ReportedCrate
  , right(Crates, charindex('/',reverse(Crates))-1) as ReportedTotalCrates
  , count(*)over(partition by Fruit) as CratesInDatabse
from (
  select left(fruit,charindex(' ',fruit)-1) as Fruit
    ,right(fruit,charindex(' ',reverse(fruit))-1) as Crates
  from denormalizedFruit
  ) f

SQLFiddle处查看。

答案 2 :(得分:0)

在sql下面将返回您想要实现的确切结果。 我假设以下内容:

表名:股票
列:水果,数量

您可能需要查找列名称。

SQL:

SELECT Fruit, COUNT(Crates) AS [Count] FROM 
(
    SELECT DISTINCT Fruit, 
           STUFF(Quantity,                                  -- Main String
                 CHARINDEX( '/',Quantity),                  -- Start
                (LEN(Quantity)-CHARINDEX( '/',Quantity)+1), -- Length
                 ''                                         -- Replace with empty string
                 ) AS Crates  
    FROM [Stock]
) As Wrap
GROUP BY Fruit
ORDER BY [Count] DESC