数据库 - GROUP BY? GROUP_CONCAT?定制申请?

时间:2014-05-15 12:26:16

标签: mysql sql database vb.net logic

数据库类型:多个...我有CSV,MDB,ACCDB,并加载到MySql中。无论如何我都可以接受它。

我在一家医疗机构工作,并且已经交付了一个拥有数百万个项目的数据库'在里面。每个订单项都包含患者的图表编号,服务日期,费用代码,付款金额以及该费用代码的总费用。我有以下数据摘录:

+-----+-------------+---------+--------------+----------+
|Chart| ServiceDate |   Code  | Payment      |  Charges |
+-----+-------------+---------+--------------+----------+
| 2241| 1/27/2014   | 12002   | 411.00       |  51.24   |
| 2241| 1/27/2014   | 17311   | 1491.00      | 616.10   |
| 2241| 1/27/2014   | 17312   | 2108.00      | 722.98   |
| 2241| 1/7/2014    | 17311   | (1491.00)    |   0.00   |
| 2241| 1/7/2014    | 17312   | (1054.00)    |   0.00   |
| 2241| 2/17/2014   | 17311   | 1491.00      | 616.10   |
| 2241| 2/17/2014   | 17312   | 1054.00      | 361.49   |
| 2241| 3/20/2014   | 17311   | (1491.00)    |   0.00   |
+-----+-------------+---------+--------------+----------+

这些都是针对同一位患者的,我可以告诉他们,因为图表'列是一样的。在此示例中,患者有3个服务日期(2014年1月27日,1/7/2014,2014年2月17日和2014年3月20日)。

现在情况变得复杂了:

我需要运行一个查询/脚本/程序/任何基本上组合这些订单项并将其转换为约会的内容。

这是将它们组合在一起的方式(仅供参考):

+-----+-------------+---------+--------------+----------+
|Chart| ServiceDate |   Code  | Payment      |  Charges |
+-----+-------------+---------+--------------+----------+
| 2241| 1/27/2014   |   12002 |  411.00      |  51.24   |
|     |             |   17311 | 1491.00      | 616.10   |
|     |             |   17312 | 2108.00      | 722.98   |
+-----+-------------+---------+--------------+----------+


+-----+-------------+---------+--------------+----------+
| 2241| 1/7/2014    |   17311 | (1,491.00)   | 0.00     |
|     |             |   17312 | (1054.00)    | 0.00     |
+-----+-------------+---------+--------------+----------+


+-----+-------------+---------+--------------+----------+
| 2241| 2/17/2014   |   17311 | 1491.00      |  616.10  |
|     |             |   17312 | 1054.00      |  361.49  |
+-----+-------------+---------+--------------+----------+


+-----+-------------+---------+--------------+----------+
| 2241| 3/20/2014   |   17311 | (1491.00)    |  0.00    |
+-----+-------------+---------+--------------+----------+

现在在数据库中有空白单元格只是不好的做法(恕我直言),所以我希望能够更进一步,这样做:

最终结果将更多的是逐行设置,每行包含约会的所有内容。

Chart和ServiceDate相同的任何列,将代码,付款和费用列(用逗号分隔)组合如下:

+-----+-------------+-------------------+------------------------+---------------------+
|Chart| ServiceDate |   Codes           |       Charges          |        Payments     |
+-----+-------------+-------------------+------------------------+---------------------+
| 2241| 1/27/2014   | 12002,17311,17312 | 411.00,1491.00,2108.00 | 51.24,616.10,722.98 |
+-----+-------------+-------------------+------------------------+---------------------+
| 2241| 1/7/2014    | 17311,17312       | (1491.00),(1054.00)    | 0.00,0.00           |
+-----+-------------+-------------------+------------------------+---------------------+
| 2241| 2/17/2014   | 17311,17312       | 1491.00,1054.00        | 616.10,361.49       |
+-----+-------------+-------------------+------------------------+---------------------+
| 2241| 3/20/2014   | 17311             | 1491.00                | 0.00                |
+-----+-------------+-------------------+------------------------+---------------------+

然而,我无法想到在SQL或Excel等方面的任何方法。我能想到的唯一能做的就是打开VS.Net并启动一个循环的应用程序通过整个数据库,查找Chart和ServiceDate相同的列,并尝试从那里开始。然而,我需要如何解决这个问题背后的逻辑就是把我当作一个循环。

以措辞形式说出("图表和ServiceDate相同的任何列,结合代码,付款和费用列")它似乎很容易......但实际上我在关于从哪里开始的损失。

有没有人对我应该采取的方向有任何想法?我是否比实际更难?

我有一种奇怪的感觉,这将是其中之一:" OMG,我应该意识到"在发布回复时输入时刻,我将提前为此道歉:)

2 个答案:

答案 0 :(得分:0)

您可以尝试使用GROUP_CONCAT运算符,该运算符允许使用GROUP BY子句对列值进行分组。

相应的(未经测试的)查询可能看起来像

SELECT Chart, ServiceDate, GROUP_CONCAT(codes), 
       GROUP_CONCAT(payment), GROUP_CONCAT(charges)
FROM TABLE
GROUP BY Chart, ServiceDate

它会为每对Chart和ServiceDate将代码,付款和费用值(使用逗号分隔符)连接在一起

有关更多信息,您可以参考mysql手册: http://dev.mysql.com/doc/refman/5.0/fr/group-by-functions.html

答案 1 :(得分:0)

我将使用基于MySQL的解决方案回答。

首先,假设。您的Chart标识了患者。您的ServiceDate定义了遭遇或约会。此假定患者每天最多只有一次遭遇。这可能没问题,但可能不适合某些临床情况。你还没有向我们展示如何消除歧义,所以我们将继续使用它。

数百万行似乎很多,但不要担心。那不是一张蹩脚的大桌子。

您的ServiceDate项应采用DATE格式('2014-03-20'),而不是您使用的文本字符串格式('3/20/2013')。这允许有效的算术,排序和分组。你需要转换它们。您可以在查询中执行此操作,也可以构建格式更好的表。

所有这些,这里是您提到的详细报告(http://sqlfiddle.com/#!2/4a018e/2/0),列值重复。

SELECT Chart, 
       ServiceDate, 
       Code, 
       SUM(Payment) AS Payments,
       SUM(Charges) AS Charges
  FROM charge
 GROUP BY Chart, ServiceDate, Code
 ORDER BY Chart, ServiceDate, Code

您的逗号分隔报告(http://sqlfiddle.com/#!2/4a018e/6/0)可以这样完成。

SELECT Chart, 
       ServiceDate, 
       GROUP_CONCAT(Code ORDER BY Code SEPARATOR ', ') AS Codes, 
       GROUP_CONCAT(Payment ORDER BY Code SEPARATOR ', ') As Payments,
       GROUP_CONCAT(Charges ORDER BY Code SEPARATOR ', ') As Charges
  FROM charge
 GROUP BY Chart, ServiceDate
 ORDER BY Chart, ServiceDate

但是,对许多人来说,这不是一个非常容易阅读的报告。您可以尝试使用此报告(http://sqlfiddle.com/#!2/4a018e/7/0),它会对付款和费用进行汇总,并详细说明代码。

SELECT Chart, 
       ServiceDate, 
       GROUP_CONCAT(Code ORDER BY Code SEPARATOR ', ') AS Codes, 
       SUM(Payment) As Payments,
       SUM(Charges) As Charges
  FROM charge
 GROUP BY Chart, ServiceDate
 ORDER BY Chart, ServiceDate

使用工具箱中的SUM()GROUP_CONCAT()GROUP BY,您应该能够制定出适当的格式。