如何处理数据库原始数据中的空白?

时间:2014-03-31 03:17:24

标签: mysql data-manipulation

我有原始交易数据,其中包含交易编号和卡号。不幸的是,卡号不会在交易的每一行重复,因此存在空白。我想用卡号来总结数据,所以我需要填补空白(我想)。

我正在处理这个问题的方法是创建一个唯一的交易号和卡号查找,将卡号与原始数据匹配,然后按卡号进行汇总。

我附上了一个小图:IMG

任何帮助改善这一过程的人都将不胜感激。摆脱查找步骤会很好!

1 个答案:

答案 0 :(得分:2)

只是一个例子,但应该有效:

  SELECT r.cardId AS `Card Number`, 
         COUNT(*) AS `# of Transactions`, 
         SUM(t.sales) AS `Total Sales`
    FROM transactions t
    JOIN (SELECT transactionId, cardId 
            FROM transactions
           WHERE cardId IS NOT NULL OR 
                 cardId != ''
         ) AS r
      ON r.transactionId = t.transactionId
GROUP BY t.transactionId

基本上我正在做的是:

  • 在外部选择中,我们抓住按transactionId分组的所有结果,这样我们就可以轻松计算交易次数并总计销售总额。
  • 然后在连接上我基本上是过滤的,所以我们从没有空或空的事务中获取cardId

结果应该是你所描述的。

CARD NUMBER     # OF TRANSACTIONS   TOTAL SALES
       5845                     3           141
       3957                     5           177

Live DEMO


对于原始+匹配结果:

SELECT t.transactionId,
       r.cardId, 
       t.sales
  FROM transactions t
  JOIN (SELECT transactionId, cardId 
          FROM transactions
         WHERE cardId IS NOT NULL OR 
               cardId != ''
       ) AS r
    ON r.transactionId = t.transactionId

Live DEMO


要更新空结果,您可以使用UPDATE,如下所示:

UPDATE transactions t
  JOIN (SELECT transactionId, cardId 
          FROM transactions
         WHERE cardId IS NOT NULL OR 
               cardId != ''
       ) AS m
    ON m.transactionId = t.transactionId
   SET t.cardId = m.cardId 
 WHERE t.cardId IS NULL OR 
       t.cardId = ''

Live DEMO