0

这是我的问题:如何使用带有 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|

使用 group by,我的查询将返回以下内容:

test custntest addre|test custname |test address |123456|

由于我使用的是 min,它将为我提供所有字段的最小值,但不一定来自同一记录。所以我在这里失去了我的记录完整性 - 查询返回的地址和名称与邮政编码不正确匹配。

那么在使用 group by 子句时如何维护非分组字段的数据完整性呢?

希望我解释得足够清楚,并提前感谢您的帮助。

编辑:解决。谢谢大家!

4

2 回答 2

3

你总是可以使用ROW_NUMBER而不是GROUP BY

WITH A AS (
    SELECT Customer_Summary, customer_name, customer_address, customer_postal_code,
        ROW_NUMBER() OVER (PARTITION BY Customer_Summary ORDER BY customer_name, customer_address) AS rn
    FROM Order
)
SELECT Customer_Summary, customer_name, customer_address, customer_postal_code
FROM A
WHERE rn = 1

然后,您可以在 ORDER BY 子句中自由订购要使用​​的客户。目前我按名称订购它们,然后按地址订购。

编辑:

我的解决方案可以满足您的要求。但我肯定同意其他人的观点:如果允许您更改数据库结构,这将是一个好主意……您不是(看到您的评论)。那么,那么 ROW_NUMBER() 是一个好方法。

于 2012-04-10T12:41:31.897 回答
3

我认为你需要重新考虑你的结构。

理想情况下,您将拥有一个Customer具有唯一 ID 的表。Order然后,您将在表中使用该唯一 ID 。那么你就不需要你正在使用的奇怪的“前 10 个字符”方法了。相反,您只需按表中的唯一 ID 进行分组Customer

您甚至还可以有一个单独的地址表,将每个地址与客户相关联,包含多行(字段将它们标记为家庭地址、送货地址、帐单地址等)

这样您就可以将客户信息与地址信息和订单信息分开。这样,如果客户更改姓名(婚姻)或地址(搬家),您就不会破坏您的数据 - 一切都与 ID 相关,而不是数据本身。

[这种关系称为外键。]

于 2012-04-10T12:42:41.027 回答