2011-09-05 8 views
0

私に似たデータを生成する次のコードがあります。ここに投稿すると(PivotWithoutAggregateFunction)、PIVOTではなくCASE文を使用する方が非数値の方が良いことが示唆されました。これが真実でないなら、私は今それを修正する時だと思います!CASEクエリの結果からNULLを置換する

 DECLARE @QA1 TABLE (SID varchar(7), FormID varchar(max), DateExam date, Present varchar(3)) 
     INSERT INTO @QA1 VALUES(1, 'Form1', '20110101', 'Yes') 
     INSERT INTO @QA1 VALUES(2, 'Form1', '20110201', 'Yes') 
     INSERT INTO @QA1 VALUES(3, 'Form1', '20110301', 'Yes') 
     INSERT INTO @QA1 VALUES(4, 'Form1', '20110401', 'Yes') 
     INSERT INTO @QA1 VALUES(5, 'Form1', '20110122', 'Yes') 
     INSERT INTO @QA1 VALUES(1, 'Form2', '20110222', 'Yes') 
     INSERT INTO @QA1 VALUES(2, 'Form2', '20110322', 'Yes') 
     INSERT INTO @QA1 VALUES(3, 'Form2', '20110422', 'Yes') 
     INSERT INTO @QA1 VALUES(1, 'Form3', '20110128', 'Yes') 
     INSERT INTO @QA1 VALUES(1, 'Form4', '20110228', 'Yes') 
     INSERT INTO @QA1 VALUES(5, 'Form5', '20110328', 'Yes') 
     INSERT INTO @QA1 VALUES(5, 'Form6', '20111228', 'Yes') 
     INSERT INTO @QA1 VALUES(4, 'Form2', '20111228', 'Yes') 

    SELECT SID, 
    MIN(CASE FormID WHEN 'Form1' THEN Present END) AS 'First', 
    MIN(CASE FormID WHEN 'Form2' THEN Present END) AS 'Second', 
    MIN(CASE FormID WHEN 'Form3' THEN Present END) AS 'Third', 
    MIN(CASE FormID WHEN 'Form4' THEN Present END) AS 'Fourth', 
    MIN(CASE FormID WHEN 'Form5' THEN Present END) AS 'Fifth', 
    MIN(CASE FormID WHEN 'Form6' THEN Present END) AS 'Sixth' 

    FROM @QA1 

    GROUP BY SID 
    ORDER BY SID 

しかし、出力は、行/列にはNULLがありますが、正しい形式は読みにくいです。

 SID First Second Third Fourth Fifth Sixth 
     1  Yes Yes  Yes  Yes  NULL NULL 
     2  Yes Yes  NULL NULL NULL NULL 
     3  Yes Yes  NULL NULL NULL NULL 
     4  Yes Yes  NULL NULL NULL NULL 
     5  Yes NULL  NULL NULL Yes  Yes 

私は何を取得(すなわち「」)、または少なくとも「いいえ」のどちらかので、どのように私は私の場合を変更することができますか?

答えて

0

これはPIVOT演算子のための完璧なクエリです。

SELECT 
    SID, 
    COALESCE([Form1],'No') AS [First], 
    COALESCE([Form2],'No') AS [Second], 
    COALESCE([Form3],'No') AS [Third], 
    COALESCE([Form4],'No') AS [Fourth], 
    COALESCE([Form5],'No') AS [Fifth], 
    COALESCE([Form6],'No') AS [Sixth] 
FROM (
    SELECT SID, FormID, Present FROM @QA1 
) S 
PIVOT (
    MIN(Present) 
    FOR FormID IN ([Form1],[Form2],[Form3],[Form4],[Form5],[Form6]) 
) AS P 
ORDER BY SID; 
2

次の例のように、問題のあるのMIN周りCOALESCEを包むことができる必要があります:

COALESCE(MIN(CASE FormID WHEN 'Form1' THEN Present END), 'No') AS 'First', 

私はそれでだろうどんなに幸せSQL Serverのかどうか分からないが、それはかなり標準SQLです。

の後にの後にMINを入れると、MIN内に入れる安全な値を選択しようとするよりも、おそらくMINが適しています。

+0

それでした!私は知らなかったThanks COLLESCE – user918967

+0

@ user918967:誰もがCOALESCEについて知っておく必要があります。それは素晴らしい便利なバリデーショナルな機能です(必要な数の引数で呼び出すことができます)。あなたは ''いいえ ''が気に入らなければ '' 'を使うことができます。 –

0
SELECT SID, 
    isnull(MIN(CASE FormID WHEN 'Form1' THEN Present END),'') AS 'First', 
    isnull(MIN(CASE FormID WHEN 'Form2' THEN Present END),'') AS 'Second', 
    isnull(MIN(CASE FormID WHEN 'Form3' THEN Present END),'') AS 'Third', 
    isnull(MIN(CASE FormID WHEN 'Form4' THEN Present END),'') AS 'Fourth', 
    isnull(MIN(CASE FormID WHEN 'Form5' THEN Present END),'') AS 'Fifth', 
    isnull(MIN(CASE FormID WHEN 'Form6' THEN Present END),'') AS 'Sixth' 

または

SELECT SID, 
    isnull(MIN(CASE FormID WHEN 'Form1' THEN Present END),'No') AS 'First', 
    isnull(MIN(CASE FormID WHEN 'Form2' THEN Present END),'No') AS 'Second', 
    isnull(MIN(CASE FormID WHEN 'Form3' THEN Present END),'No') AS 'Third', 
    isnull(MIN(CASE FormID WHEN 'Form4' THEN Present END),'No') AS 'Fourth', 
    isnull(MIN(CASE FormID WHEN 'Form5' THEN Present END),'No') AS 'Fifth', 
    isnull(MIN(CASE FormID WHEN 'Form6' THEN Present END),'No') AS 'Sixth' 
+0

DateExamフィールドでこの構文を使用すると、フォームがない場合、日付は1900-01-01になります。それを ''に変更することはできますか? – user918967

+0

@ user918967 DateExamフィールドをvarcharに変換する必要があります。そうしないと、SQLが好きではないと思います。言い換えればこれisnull(CONVERT(varchar(10)、DateExam、101)、 '') – Icarus

+0

もう一度ありがとう! 1つの最後のビット。私はDateExamに34日を追加し、それがDateThirtyFutureと呼ばれるので、私のフォームが期限切れであるかどうかを見ることができます。だから私がしたいのは、フォームが存在するとき、はいをフィールドに入れておくことですが、空白の場合は34日以上経過したかどうかを確認します(DateThirtyFuture)。そうでない場合は空白のままにします。 – user918967

関連する問題