数据库类型:多个...我有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,我应该意识到"在发布回复时输入时刻,我将提前为此道歉:)
答案 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
,您应该能够制定出适当的格式。