2016-12-20 2 views
0

共通テーブル式の一部である次のクエリがあります。私は "Select -1"ステートメントの機能を理解していません。これは、「EXISTS」ステートメントで使用される「Select 1」とは明らかに異なります。何か案は?「選択-1」とは何か、「選択1」とはどのように違うのですか?

select days_old, 
     count(express_cd), 
     count(*), 
     case 
      when round(count(express_cd)*100.0/count(*),2) < 1 then '0'  
      else '' 
     end || 
      cast(decimal(round(count(express_cd)*100.0/count(*),2),5,2) as varchar(7)) || 
      '%' 
    from foo.bar 
    group by days_old 
    union all 
    select -1, -- Selecting the -1 here 
     count(express_cd), 
     count(*), 
     case 
      when round(count(express_cd)*100.0/count(*),2) < 1 then '0' 
      else '' 
     end || 
      cast(decimal(round(count(express_cd)*100.0/count(*),2),5,2) as varchar(7)) || 
      '%' 
    from foo.bar 
    where days_old between 1 and 7 
+0

ここで特別なことは何も表示されません。おそらくこのクエリの作成者は最初の列の静的な値として '-1'を必要とします。 –

+0

おそらく、それは 'days_old'がおそらく決して負にならないため、最初の選択の値と区別することが選択されました。しかし、他の人が言っているように、私たちができるのは推測です。 – Bridge

+0

最後の7日間のサマリー行を作成するだけです。すべての日に専用レコード(最初の部分)と最後の7日間の要約(おそらく何らかのビジネス要件のため)があります。そして、はい、これは単なる野生の推測です。 – Pred

答えて

0

クエリに基づいて、1と7の間days_oldを持つすべてのレコードは、として「-1」が出力されます、それは、select -1が何をするか、ここで特別なものではありませんし、existsselect -1select 1の間に違いはありません、両方の意志レコードを1または-1として出力すると、データがあるかどうかをチェックするために同じことが行われます。

union allがあり、選択した4つの列をunion allで比較したところ、days_oldが1から7の間ではない最終結果を得ることを推測しています。 day_oldは1から7までの数字を取るため1になります。

+0

1から7の間のdays_oldに負の1を入力します。wrong、sryと入力します。 – LONG

2

各行が返されるのは、単に「1選択」を同じように、番号を選択し、「マイナス1」の番号を選択します「1」の行ごとに返されます。

途中でEXISTSステートメントで使用される "select 1"構文について特別なものはありません。 EXISTSはレコードを返す必要があり、レコードにはデータが必要であるため、ランダムな値を選択するだけです。番号1で十分です。

なぜこれを行うのですか、私は分かりません。

0

これは単なるグループ化ロジックです。 days_old列プラスdays_old 1〜7だから、-1はちょうど別の追加のグループが存在するデータのための1つ以上のグループによってグループ化された データ(カウントとラウンド)集約

あなたのクエリが返す、それは1することはできませんdays_old = 1はもう1つの有効なグループです。

ROW2 ... days_old = 1つのカウント(*)= 2:

行1:

結果は次のようになります... = 3カウントdays_old(*)= 5

ROW3:days_old = 9 COUNT(*)= 6 ...

ROW4:days_old = -1 COUNT(*)= 7

1

あなたは組合文を持って、組合の各一部同じ列を含む必要があります。私がこれを見ると私が読んだところから、最初の声明は、あなたに毎日の古い値のための1行と、毎日の古い統計値を与えています。組合の2番目の部分は、わずか1週間かそれ以下のすべてのレコードの要約を提供しています。ここでは、古い列は関係がないため、結合を行うためにプレースホルダとして仮の値を入れています。もちろん、これは何年もの間に何千ものクエリを読むことに基づく推測に過ぎません。確かに、私は実際にtehコードを実行する必要があります。

これはCTEであると言いますが、なぜこれが起こっているのかを実際に理解するには、生成するデータとそのデータがCTEを使用する次のクエリでどのように使用されるのかを調べる必要があります。それはあなたの質問に答えるかもしれません。

あなたが聞いたことは、基本的にあなたの会社に固有のビジネスルールに関するものです。本当の答えは、コードの元の作成のための要件文書にあるべきです。彼らを探して読んでください。私たちは自分の経験に基づいて推測することができますが、あなたの会社の人々だけがなぜここの質問に答えることができます。

ドキュメントが見つからない場合は、データを使用するステークホルダーに対して話し合う必要があります(可能であれば直接話してください)。コードを実行して結果を分析した後にのみ、これを実行して、返されるデータの意味をよりよく理解してください。

関連する問題