2016-08-17 1 views
1

もう1つのSIMILARの回答がありましたが、2ページの長さです。私は2つのテーブル、tableAとtableBを持っていますが、tableAには存在するが、tableBには存在しない行のCOUNTSを見つける必要があります。また、tableBのupdate_onが今日の日付ではありません。TSQLは右テーブルから欠落している行の数を取得します

マイテーブル:

にtableA:

release_id  book_name  release_begin_date 
---------------------------------------------------- 
1122   midsummer   2016-01-01   
1123   fool's errand  2016-06-01   
1124   midsummer   2016-04-01   
1125   fool's errand  2016-08-01    

TABLEB:

release_id book_name  updated_on 
----------------------------------------- 
1122   midsummer   2016-08-17 
1123   fool's errand  2016-08-16** 

期待される結果:各書籍は1つのリリースIDが欠落しているので、1カウントです。しかし、テーブルBの愚かな使い方の行には、今日ではなく、昨日の日付が更新されているため、count_of_not_updatedでカウントする必要があります。

book_name  count_of_missing count_of_not_updated 
------------------------------------------------------- 
midsummer   1     0 
fool's errand  1     1 

注:無駄足はTABLEBに存在しているにもかかわらず、私は日付が昨日と今日ではないですupdated_onているためcount_of_missingでそれを表示する必要があります。私はそれが左の結合と他の何かの組み合わせでなければならないことを知っていますが、ここのキッカーは、左のテーブルから欠落した行を取得するだけでなく、updated_onテーブルが今日の日付かどうかをチェックし、 count_of_not_updatedにある。

+0

を - それはあなたが無駄足(ID 1125)のために1欠けているあなたの期待される結果かららしいです1は更新されない(1123)。しかし、あなたは欠けているとみなすには1123が必要だと言っていますか?それで、馬鹿のためのcount_of_missingコラムで2ではないでしょうか? – TPhe

+0

@TPhe_foolの使用には1行が欠けているためcount_of_missingでは1になりますが、foolの使用のためのtableBの既存の行はtoday_count_of_not_updatedに1であるtoday_(今日)/ getdate()ではないupdated_onの日付を持ちます。 1行が欠落している行と存在する行とは異なり、今日(今日)の更新日が –

+0

です。その場合、私は自分のクエリを編集します。あなたの質問の文章「注:愚かなことがテーブルBにあるにもかかわらず、今日は昨日であり、今日は更新されていないので、count_of_missingに表示する必要があります。 – TPhe

答えて

2
select sum(case when b.release_id is null then 1 else 0 end) as noReleaseID 
    , sum(case when datediff(d, b.release_date, getdate()) > 0 then 1 else 0 end) as releaseDateNotToday 
    , a.release_id 
from tableA a 
left outer join tableB b on a.release_id = b.release_id 
Group by a.release_id 

この例は、case文がtrueを返すインスタンスを追加するcase statementsum functionを使用しています。現在のコードでは、あなたの例のように、テーブルbのすべての古いリリース日付をカウントすることを前提としていることに注意してください - 各ブックに複数の古いリリース日付がテーブルbにあり、最新のリリース日。

+0

私は左結合に従っていません - テーブル名の代わりにカラム名を持っています:tableA left outer join tableB on tableA.release_id = tableB.release_id and tableA.book_name = tableB.book_name –

+0

@DamonMatt私の間違いは、コピー/ペーストエラーです。それはちょうどtableAテーブルBに結合を残す必要があります。私は自分の投稿を編集しました。 – TPhe

+0

あなたが述べたように、実際のクエリにはもっと多くの列が含まれていますが、これは私にフレームワークを提供してくれます。あなたの助けをありがとう - あなたの答えを受け入れた。 –

0

この

DECLARE @tableA TABLE (release_id INT, book_name NVARCHAR(50), release_begin_date DATETIME) 
DECLARE @tableB TABLE (release_id INT, book_name NVARCHAR(50), updated_on DATETIME) 

INSERT INTO @tableA 
VALUES 
(1122, 'midsummer',   '2016-01-01'),   
(1123, 'fool''s errand',  '2016-06-01'),   
(1124, 'midsummer',   '2016-04-01'),   
(1125, 'fool''s errand',  '2016-08-01') 


INSERT INTO @tableB 
VALUES 
(1122, 'midsummer',  '2016-08-17'), 
(1123, 'fool''s errand', '2016-08-16') 

;WITH TmpTableA 
AS 
(
    SELECT 
     book_name, 
     COUNT(1) CountOfTableA 
    FROM 
     @tableA 
    GROUP BY 
     book_name 
), TmpTableB 
AS 
(
    SELECT 
     book_name, 
     COUNT(1) CountOfTableB, 
     SUM(CASE WHEN CONVERT(VARCHAR(11), updated_on, 112) = CONVERT(VARCHAR(11), GETDATE(), 112) THEN 0 ELSE 1 END) count_of_not_updated 
    FROM 
     @tableB 
    GROUP BY 
     book_name 
) 


SELECT 
    A.book_name , 
    A.CountOfTableA - ISNULL(B.CountOfTableB, 0) AS count_of_missing, 
    ISNULL(B.count_of_not_updated, 0) AS count_of_not_updated 
FROM 
    TmpTableA A LEFT JOIN 
    TmpTableB B ON A.book_name = B.book_name 

結果試してみてください。私は少し混乱し、あなたの最後の注意点を見つけることだ

book_name   count_of_missing count_of_not_updated 
-------------------- ---------------- -------------------- 
fool's errand  1    1 
midsummer   1    1 
関連する問題