3

也许我在看这个问题都错了,但是这里有。

我们有一个数据库,它是我们在办公室使用的一些 CRM 软件的后端。老板想要一个简单的查询来提取客户及其配偶的生日。

表结构如下:

Client Details Table:
Client Name, Client Birthday, Spouse Name, Spouse Birthday, <etc>

我有一个带有案例选择的简单查询,它将确定客户的生日或配偶的生日是下个月的任何时间。

查询压缩如下:

SELECT a.*
FROM
  (SELECT
     (CASE    WHEN <birthday calculation>
              ELSE NULL 
      END) as WhoHasBDay,
      ClientName,
      SpouseName
   FROM
     ClientDetailsTable) as a
WHERE
   a.WhoHasBDay IS NOT NULL

这将返回客户或配偶在接下来的 X 天内过生日的任何条目。

但是,如果客户和他们的配偶在接下来的 X 天内过生日,我希望查询为每个返回一次结果。

IE,这里是下面的数据

CLIENT X: Birthday in 5 days
CLIENT Y: Spouse's Birthday in 8 days
CLIENT Z: Birthday in 3 days, Spouse's Birthday in 9 days.

我想要的结果集是

CLIENT X BDAY T+5
CLIENT Y SPOUSE BDAY T+8
CLIENT Z BDAY T+3
CLIENT Z SPOUSE BDAY T+9

也许我以错误的方式处理这个问题,在这种情况下,我们将不胜感激有关更好的攻击方法的建议。否则,如果有解决方案,请告诉我。

4

4 回答 4

0

将两个查询联合在一起:

 SELECT ClientName, ClientName AS BirthdayPerson, ClientBirthday FROM Clients 
    WHERE ClientBirthday BETWEEN X AND Y
 UNION ALL 
 SELECT ClientName, SpouseName AS BirthdayPerson, SpouseBirthday FROM Clients 
    WHERE SpouseBirthday BETWEEN X AND Y

这将为您提供日期 X 和 Y 之间生日的每个人(您可以根据需要更改生日计算)。

于 2012-10-02T19:04:03.903 回答
0

我会将此作为两个单独查询的联合来解决:一个针对客户,一个针对他们的配偶。

SELECT ClientName, NULL AS SpouseName, Birthday
    FROM ClientDetailsTable
    WHERE <birthday calculation is true>
UNION ALL
SELECT ClientName, SpouseName, SpouseBirthday
    FROM ClientDetailsTable
    WHERE <spouse birthday calculation is true>
于 2012-10-02T19:04:53.883 回答
0

您需要像这样在 sql 中使用“联合”:

select * from ClientDetailsTable where "client hasbirthday" union all

select * from clientDetailsTable where "Spouse hasbirthday"

于 2012-10-02T19:08:53.493 回答
0

这是sql server中的一些示例代码。在接下来的 16 天内,为您提供两种生日类型中最近的第一个。

SELECT ClientName, ClientBirthday, null as SouseBirthday, ABS(DATEDIFF(day,GETDATE(),ClientBirthday)) as days
FROM ClientDetailsTable
WHERE ClientBirthday BETWEEN GETDATE() AND DATEADD(day,16,ClientBirthday)
UNION ALL
SELECT ClientName, null as ClientBirthday, SouseBirthday, ABS(DATEDIFF(day,GETDATE(),SouseBirthday)) as days
FROM ClientDetailsTable
WHERE SouseBirthday BETWEEN GETDATE() AND DATEADD(day,16,SouseBirthday)
ORDER BY days asc

注意,未测试可能有错别字。

于 2012-10-02T19:11:10.980 回答