【发布时间】:2012-04-10 12:28:46
【问题描述】:
这是我的问题:如何使用带有 group by 的聚合函数来保持记录完整性?
为了进一步解释,这里有一个例子。
我有一个包含以下列的表:(将其视为“订单”表)
Customer_Summary (first 10 char of name + first 10 char of address)
Customer_Name
Customer_Address
Customer_Postal Code
Order_weekday
每个“订单”只有一行,有很多行具有相同的客户名称、地址和摘要。
我要做的是显示客户的姓名、地址和邮政编码,以及他们在每个工作日下的订单数量,按客户的摘要分组。
所以数据应该是这样的:
Summary | Name | Address | PCode | Monday | Tuesday | Wednesday | Thursday | Friday
test custntest addre|test custname|test address|123456 | 1 | 1 | 1 | 1 | 1
我只想将类似客户摘要的记录分组在一起,但显然我希望显示一个姓名、地址和邮政编码。我现在正在使用 min(),所以我的查询看起来像:
SELECT Customer_Summary, min(customer_name), min(customer_address), min(customer_postal_code)
FROM Order
Group by customer_summary
我已经省略了我的工作日逻辑,因为我认为没有必要。
我的问题是 - 这些客户中有一些具有相同客户摘要的客户具有不同的地址和邮政编码。
所以我可能有两个客户,看起来像:
test custntest addre|test custname |test address |323456|
test custntest addre|test custname2|test address2|123456|
使用分组依据,我的查询将返回以下内容:
test custntest addre|test custname |test address |123456|
由于我使用的是 min,它将为我提供所有字段的最小值,但不一定来自同一记录。所以我在这里失去了我的记录完整性 - 查询返回的地址和名称与邮政编码不正确匹配。
那么,在使用 group by 子句时,如何维护非分组字段的数据完整性?
希望我解释得足够清楚,并提前感谢您的帮助。
编辑:已解决。谢谢大家!
【问题讨论】:
-
所以您想进行汇总,但是当客户拥有多个地址时您想怎么做?你能举一个你想要最终得到的结果集的例子吗?
-
客户信息应该在其自己的表中 - 如果您不断在
Orders表中复制它,您将永远无法保证任何数据完整性/数据质量..... -
我确实在上面提供了一个例子——就选择哪个地址而言,唯一重要的是它必须与姓名和邮政编码相匹配。我使用 min 是因为它最简单,但正如我上面演示的那样,我以这种方式失去了记录的完整性。 @marc:我意识到这一点;不幸的是,这个数据库结构已经给了我,我无法改变它。我意识到这可能需要我在这个问题上咬紧牙关,但我希望有一个我没有想到的解决方案......
标签: sql sql-server sql-server-2005