SQL查询使得难以进行数据聚合

时间:2014-11-26 14:51:31

标签: mysql sql database

我需要从MySQL数据库中提取数据来进行报告,而且我遇到了一些我以前从未见过的东西。假设我有4个硬件组件的数据,客户可以请求ram,ip,cpu和备份组件。我的表中的每个记录都有一个“数量”字段和一个“组件”字段,因此如果客户希望购买4个ram数量,则获得值4并将值组合为ram。

每条记录可以是产品订阅的激活(组件和数量等于NULL)或组件请求(每种组件类型一条记录,因此如果客户想要购买4个RAM和1个IP,我将拥有激活,4 ram的请求和1 ip的请求。

在聚合报告中,我需要每个组件都有一个列,所以cpu列,ip列等等。如果客户刚刚注册或没有订购那种组件,我需要用NULL填充值,或者如果他购买了其中一个组件的数量。

让它变得实用:

  • John注册
  • John买1 ip
  • John买了4个ram

我想要的是:

  • 第一条记录,cpu,ip,ram,backup设置为null
  • 第二条记录,ip设置为1,其他记录为NULL
  • 第3条记录,ram设为4,其他为NULL

我怎样才能完成这样的事情?我不知何故需要将组件列的可能值作为新的不同列,并用数量列的值填充它们。

2 个答案:

答案 0 :(得分:1)

为什么不在可能的组件上使用案例?

select
    CASE 
        WHEN component='ip' 
        THEN quantity
        ELSE NULL 
    END as 'ip',
    CASE 
        WHEN component='ram' 
        THEN quantity
        ELSE NULL 
    END as 'ram',
    CASE 
        WHEN component='cpu' 
        THEN quantity
        ELSE NULL 
    END as 'cpu',
    CASE 
        WHEN component='backup' 
        THEN quantity
        ELSE NULL 
    END as 'backup'
from table;

答案 1 :(得分:0)

我讨厌这样说但是这个数据库设计可能会造成混乱,因为你正在分组对象'你不应该这样做。例如,你应该有一个只是注册的表和一个订单表与订货人的parentIds ..但我离题了。如果我理解你的问题:

要解决此问题,您需要子查询或多个查询,例如一个选择*其中ip为Null且cpu为Null且ram为NULL,然后对结果求和并插入数量列,其中id = this ID

选择一个cpu为Null,一个选择其他为null的位置,然后对结果求和并插入数量列,其中id = this id,

......等等。

然后解析每个查询的输出。