Sql 来自非规范化表的信息
我有一个表,它是客户表和订单表的组合。它看起来像这样:Sql 来自非规范化表的信息,sql,ms-access,Sql,Ms Access,我有一个表,它是客户表和订单表的组合。它看起来像这样: _______________________________________________________ | Id | Cust Id | Other Id | Date | Has Prod 1 | Has Prod 2 | ------------------------------------------------------- | 1 | | 1 | 2009 | False |
_______________________________________________________
| Id | Cust Id | Other Id | Date | Has Prod 1 | Has Prod 2 |
-------------------------------------------------------
| 1 | | 1 | 2009 | False | True |
| 2 | 1 | | 2008 | False | True |
| 3 | 2 | | 2008 | True | False |
| 4 | 1 | | 2009 | True | True |
| 5 | 2 | | 2009 | False | False |
| 6 | 1 | | 2010 | False | True |
-------------------------------------------------------
我知道是否有客户的唯一方法是在Cust Id列中查找客户Id。Cust Id和其他Id指向与本讨论无关的其他表
我想做两件事:
我希望生成一个报告或表格,总结客户并执行“Has”列的逻辑“or”,例如:
_________________________________________________
| Id | Cust Id | Other Id | Has Prod 1 | Has Prod 2 |
-------------------------------------------------
| 1 | 1 | | True | True |
| 2 | 2 | | True | False |
-------------------------------------------------
_______________________________________________________
| Id | Cust Id | Other Id | Date | Has Prod 1 | Has Prod 2 |
-------------------------------------------------------
| 5 | 2 | | 2009 | False | False |
| 6 | 1 | | 2010 | False | True |
-------------------------------------------------------
我希望获得每个客户Id组中的最新行,例如:
_________________________________________________
| Id | Cust Id | Other Id | Has Prod 1 | Has Prod 2 |
-------------------------------------------------
| 1 | 1 | | True | True |
| 2 | 2 | | True | False |
-------------------------------------------------
_______________________________________________________
| Id | Cust Id | Other Id | Date | Has Prod 1 | Has Prod 2 |
-------------------------------------------------------
| 5 | 2 | | 2009 | False | False |
| 6 | 1 | | 2010 | False | True |
-------------------------------------------------------
提前谢谢。
GRB
MIN()返回最小的值-1为True,0为False,因此如果分组行的一条记录为True,则返回-1
SELECT t1.*
FROM customerorder AS t1
INNER JOIN (SELECT [Cust ID], Max([Date]) As MaxDate
FROM customerorder
GROUP BY [Cust ID]) AS t2
ON ([t1].[Cust ID] = [t2].[Cust ID] AND [t1].[Date] = [t2].[MaxDate])
如果最后一行由Max([Date])确定,如示例数据所示,则上述查询将返回每个客户的最后一行
MIN()返回最小的值-1为True,0为False,因此如果分组行的一条记录为True,则返回-1
SELECT t1.*
FROM customerorder AS t1
INNER JOIN (SELECT [Cust ID], Max([Date]) As MaxDate
FROM customerorder
GROUP BY [Cust ID]) AS t2
ON ([t1].[Cust ID] = [t2].[Cust ID] AND [t1].[Date] = [t2].[MaxDate])
如果最后一行由Max([Date])确定,如示例数据所示,则上述查询将返回每个客户的最后一行 到目前为止你试过什么?举例来说,您是在使用SQL还是Access的查询?Access QBE使用SQL,所以@rajah9的问题毫无意义。@David-W-Fenton,有些Access用户从不编写SQL语句,只使用QBE GUI。(上图显示OP可能是QBE用户。)我试图确定OP是只熟悉QBE,还是能够理解SQL解决方案。我不会说Access QBE“使用SQL”,因为它是一个生成SQL的接口。所有Access用户都编写SQL——他们只是不必手工编写。如果您使用的是Access,那么您使用的是SQL,因此您的问题毫无意义。如果你想问他们是否在使用QBE,那么就直接问这个问题,而不是使用误导性的术语来暗示那些不真实的事情。到目前为止,你做了哪些尝试?举例来说,您是在使用SQL还是Access的查询?Access QBE使用SQL,所以@rajah9的问题毫无意义。@David-W-Fenton,有些Access用户从不编写SQL语句,只使用QBE GUI。(上图显示OP可能是QBE用户。)我试图确定OP是只熟悉QBE,还是能够理解SQL解决方案。我不会说Access QBE“使用SQL”,因为它是一个生成SQL的接口。所有Access用户都编写SQL——他们只是不必手工编写。如果您使用的是Access,那么您使用的是SQL,因此您的问题毫无意义。如果你想问他们是否在使用QBE,那么就直接问这个问题,而不是使用误导性的术语来暗示不真实的事情。库拉里斯,非常感谢你及时的回答。看起来这些能满足我的需要。GRB@GRB欢迎来到SO!看一看这张照片。你可以投有用的票,甚至可以接受。库拉里斯,非常感谢你及时的回答。看起来这些能满足我的需要。GRB@GRB欢迎来到SO!看一看这张照片。你可以投有用的票,甚至可以接受。