2

質問の1つが一番下で解決すると思った問題がありますが、それでも問題があります。問題は、私のcaseステートメントが間違っている(ただし、エラーなしで実行される)が、他に何が欠けているのかわからないことです。

私の目的は、Table2にレコードがないためにDueDateがNULLの場合、この値を「NULL」ではなく「No」として表示することだけです。コードに「IsNull」を追加しましたが、問題は解決していません。これらのフォーラムでISNULL()とCOALEASE()を見たことがありますが、希望する結果を得ることができません。

これが私の作業コードです:

SELECT 
    Client, 
    COUNT(*) AS ReadyRecords, 
    (SELECT COUNT(*) FROM Table1 EPR WHERE actioned=8 AND EPR.Client=Table1.Client) AS Outstanding, 
    (SELECT TOP 1 
        CASE 
            WHEN DueDate < GETDATE() THEN 'Yes' 
            WHEN DueDate IS NULL THEN 'No' 
        ELSE 'No' 
        END AS DueDate
    FROM Table2 GL WHERE GL.Client=Table1.Client ORDER BY DueDate) AS DueDate

    FROM Table1 WHERE Actioned=2 GROUP BY Client

編集:

現在の結果セット:

Client   | ReadyRecords  |  Outstanding  |  DueDate

Test     |     42        |      54       |   NULL
Stack    |     150       |      10       |   NULL
JBloggs  |     32        |      28       |   Yes
DBloggs  |     2         |      17       |   Yes
Overflow |     1         |      1        |   No

望ましい結果セット:

Client   | ReadyRecords  |  Outstanding  |  DueDate

Test     |     42        |      54       |   No
Stack    |     150       |      10       |   No
JBloggs  |     32        |      28       |   Yes
DBloggs  |     2         |      17       |   Yes
Overflow |     1         |      1        |   No

表1:

id      |  Client   |   Actioned  | etc...

5245    |  Test     |      8      | etc...
....so on

表2:

id   |   Client   |   DueDate

1    |  JBloggs   | 2012-12-01 00:00:00.000
2    |  DBloggs   | 2012-12-05 00:00:00.000
3    |  Overflow  | 2012-12-12 00:00:00.000

他に何か必要な場合はお知らせください。

類似/関連する質問:

4

5 に答える 5

5

ISNULL()次のように、 orCOALESCE()関数をインラインサブクエリ全体に適用する必要があります。

SELECT 
    Client, 
    COUNT(*) AS ReadyRecords, 
    (SELECT COUNT(*) FROM Table1 EPR 
     WHERE actioned=8 AND EPR.Client=Table1.Client
    ) AS Outstanding, 

    COALESCE(
        (SELECT TOP 1 
            CASE 
                WHEN DueDate < GETDATE() THEN 'Yes' 
            END AS DueDate
        FROM Table2 GL WHERE GL.Client=Table1.Client ORDER BY DueDate
        ), 'No' 
    ) AS DueDate

FROM Table1  WHERE Actioned=2  GROUP BY Client ;

または、CASE式をそこに移動します。

SELECT 
    Client, 
    COUNT(*) AS ReadyRecords, 
    (SELECT COUNT(*) FROM Table1 EPR 
     WHERE actioned=8 AND EPR.Client=Table1.Client
    ) AS Outstanding, 

    CASE WHEN 
           (SELECT TOP 1 
              DueDate
            FROM Table2 GL WHERE GL.Client=Table1.Client ORDER BY DueDate
           ) < GETDATE() 
        THEN 'Yes'
        ELSE 'No'
    END AS DueDate

FROM Table1  WHERE Actioned=2  GROUP BY Client ;
于 2012-12-06T13:32:58.533 に答える
2

まず、テーブルの日時フィールドがNULLとして表示される可能性があることを知っておく必要がありますが、クエリで使用する場合は、SQLでそのデータ型に許可されている最小の日付に変換されます。これは「1900-01-01」です。したがって、実際よりも多くの「はい」の値を取得する可能性があります。

于 2012-12-06T13:48:53.153 に答える
0
You can use this...
SELECT 
Client, 
COUNT(*) AS ReadyRecords, 
(SELECT COUNT(*) FROM Table1 EPR WHERE actioned=8 AND EPR.Client=Table1.Client) AS Outstanding, 
(SELECT TOP 1 
    CASE 
        WHEN DueDate < GETDATE() THEN 'Yes' 
        ELSE ISNULL(Cast(DueDate AS VARCHAR),'NO' )        
    END AS DueDate
FROM Table2 GL WHERE GL.Client=Table1.Client ORDER BY DueDate) AS DueDate

FROM Table1 WHERE Actioned=2 GROUP BY Client
于 2012-12-06T12:24:02.463 に答える
0

問題は、DueDateがNULLの場合、DueDate < GetDate()結果がNULLになりNo、そのような場合にDueDateがGetDateよりも小さくなることはないため、結果として得られることだと思います。このように順序を変更します

CASE 
    WHEN DueDate IS NULL THEN 'No'
    WHEN DueDate < GETDATE() THEN 'Yes'        
ELSE 'No' 
END AS DueDate

これを行うことにより、他の条件の前にNULL値が最初にチェックされます。または、この行を次のように変更できます

WHEN ISNULL(DueDate,'Some Valid Default Value Here') < GETDATE() THEN 'Yes'    
于 2012-12-06T13:23:15.927 に答える
0

これは機能しますか?それにいくつかの不具合があるのではないかと思われますが、私は現在管理sudioを持っていません:

SELECT 
        Client, 
        COUNT(*) AS ReadyRecords, 
        (SELECT COUNT(*) FROM Table1 EPR WHERE actioned=8 AND EPR.Client=Table1.Client) AS Outstanding, 
        [DueDate] = CASE 
                                WHEN [MXDATE] < GETDATE() THEN 'Yes' 
                                WHEN [MXDATE] IS NULL THEN 'No' 
                            ELSE 'No' 
                            END 
FROM 
    Table1 T1
    LEFT OUTER JOIN
        (
        SELECT 
            Client,
            [MXDATE] = MAX(DueDate)
        FROM Table2
            GROUP BY Client
        ) GL
        ON
         GL.Client=T1.Client 
WHERE Actioned=2 
GROUP BY Client
于 2012-12-06T13:27:16.243 に答える