3

select ステートメントがあり、そのうちの少なくとも 1 つに今日から 60 日の差がある日付がある場合にのみ、すべての値を返したいと考えています。問題は、比較したい列を返す外部適用があり、それらが異なるテーブルから来ていることです(1つは現金アイテムに属し、もう1つはカードアイテムに属します)。
私が以下を持っていることを考慮して:

OUTER APPLY (
    SELECT COUNT(*) AS quantity, MIN(date) AS item_date
        FROM dbo.get_cash_items(loans.id_cash) AS cash_item
        HAVING loans.id_product_type = 1 --Cash
    UNION
    SELECT COUNT(*) AS quantity, MIN(date) AS item_date
        FROM dbo.get_card_items(loans.id_card) AS card_item
        HAVING loans.id_product_type = 2 --Card
) AS items

の場合にのみすべての行を返したいのですDATEDIFF(DAY, MIN(items.item_date), GETDATE()) >= 60が、この条件に一致する行が 1 つだけでもすべてが必要です。
これを行うための最良のアプローチは何ですか?

編集
より明確にするために、ユースケースを説明します。
クライアントがいずれかの期日から60日以上遅れている場合にのみ、すべてのローンのアイテムを表示する必要があります

4

3 に答える 3

1

また、何を期待しているのかわかりませんが、それはどうですか:

WITH items
     AS (SELECT Count(*)  AS quantity,
                Min(date) AS item_date
         FROM   dbo.Get_cash_items(loans.id_cash) AS cash_item
         HAVING loans.id_product_type = 1
         UNION
         SELECT Count(*)  AS quantity,
                Min(date) AS item_date
         FROM   dbo.Get_card_items(loans.id_card) AS card_item
         HAVING loans.id_product_type = 2)
SELECT a.*
FROM   items AS a,
       (SELECT TOP 1 *
        FROM   items AS b
        WHERE  Datediff(day, b.item_date, Getdate()) >= 60) AS c  

これは一種の CROSS JOIN でありC、条件が満たされた場合、それに応じてテーブルに 1 行または 0 行が含まれます。他のテーブルのすべての行に結合されます。

于 2012-09-18T18:03:58.420 に答える
0

このようなことを試しましたか?

SELECT a.quantity, a.item_date
FROM
    (SELECT COUNT(*) AS quantity, MIN(date) AS item_date
        FROM dbo.get_cash_items(loans.id_cash) AS cash_item
        HAVING loans.id_product_type = 1
    UNION
    SELECT COUNT(*) AS quantity, MIN(date) AS item_date
        FROM dbo.get_card_items(loans.id_card) AS card_item
        HAVING loans.id_product_type = 2) a 
WHERE DATEDIFF(day, a.item_date, GETDATE()) >= 60
于 2012-09-18T17:29:11.783 に答える
0

通常、CTE を使用して、選択したいレコードのキーを選択し、それに参加します。以下は、例の試みです。

with LateClients as
(
    SELECT LoadId FROM Payment Where /*payment date later than 60 days*/
)

SELECT     p.LoanId, 
           p.UserId 
FROM       Payment as p
INNER JOIN LateClients as LC
ON         p.LoanId = lc.LoanId 
OrderBy    p.LoanId, p.UserId

投稿したコードとは少し異なることは承知していますが、これは概念を説明する単純化された例です。幸運を!

于 2012-09-18T18:10:48.133 に答える