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 日以内に誕生日を迎える場合、クエリでそれぞれに 1 回ずつ結果を返したいと思います。

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

2つのクエリを結合します。

 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

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

NB、テストされていないため、タイプミスがある可能性があります。

于 2012-10-02T19:11:10.980 に答える
0

次のようにSQLで「ユニオン」を使用する必要があります。

select * from ClientDetailsTable where "client has birthday" union all

select * from clientDetailsTable where "配偶者の誕生日"

于 2012-10-02T19:08:53.493 に答える
0

私はこれに、クライアント用と配偶者用の 2 つの個別のクエリの UNION として取り組みます。

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 に答える