2016-10-28 7 views
1

私は、異なるテーブルに基づいて複数のselect文を結合しています。問題は、出力が自動的にTOTAL_NUM列でソートされることです。これは、結合を行った順番にとどまるのではなく、これを避ける方法はありますか?SASのproc sql unionでのソートを防ぐ方法は?

ここに私のコードのサンプルがあります。

proc sql; 
SELECT COUNT(loannumber) AS TOTAL_NUM, SUM(LoanAmt) as LOAN_AMOUNT FROM sub_620 WHERE Flag = 1 
union 
SELECT COUNT(loannumber) AS TOTAL_NUM, SUM(LoanAmt) as LOAN_AMOUNT FROM 620_639 WHERE Flag = 1 
union 
SELECT COUNT(loannumber) AS TOTAL_NUM, SUM(LoanAmt) as LOAN_AMOUNT FROM 640_660 WHERE Flag = 1 
union 
SELECT COUNT(loannumber) AS TOTAL_NUM, SUM(LoanAmt) as LOAN_AMOUNT FROM V700_719 WHERE Flag = 1 
union 
SELECT COUNT(loannumber) AS TOTAL_NUM, SUM(LoanAmt) as LOAN_AMOUNT FROM 720_739 WHERE Flag = 1 
union 
SELECT COUNT(loannumber) AS TOTAL_NUM, SUM(LoanAmt) as LOAN_AMOUNT FROM 740_759 WHERE Flag = 1; 
run; 

出力はこのようですが、順序のステートメントではなくTOTAL_NUMでソートされます。

enter image description here
+0

申し訳ありませんが、この回答を説明しました。 http://stackoverflow.com/questions/21181664/sql-server-union-but-keep-order –

+1

テーブル内で注文を保つという保証はありません。 SQL行の順序は、明示的に正確に指定しない限り保証されません。 – Reeza

答えて

2

SQLに出力を並べ替える場合は、ソートできるものを与えます。

proc sql; 
    SELECT 1 as ORDER,COUNT(loannumber) AS TOTAL_NUM, SUM(LoanAmt) as LOAN_AMOUNT 
    FROM sub_620 WHERE Flag = 1 
    union 
    SELECT 2 as ORDER,COUNT(loannumber) AS TOTAL_NUM, SUM(LoanAmt) as LOAN_AMOUNT 
    FROM 620_639 WHERE Flag = 1 
    order by 1 
    ; 
quit; 
1

使用UNION ALL

proc sql; 
    SELECT COUNT(loannumber) AS TOTAL_NUM, SUM(LoanAmt) as LOAN_AMOUNT FROM sub_620 WHERE Flag = 1 
    union all 
    SELECT COUNT(loannumber) AS TOTAL_NUM, SUM(LoanAmt) as LOAN_AMOUNT FROM 620_639 WHERE Flag = 1 
    union all 
    SELECT COUNT(loannumber) AS TOTAL_NUM, SUM(LoanAmt) as LOAN_AMOUNT FROM 640_660 WHERE Flag = 1 
    union 
    SELECT COUNT(loannumber) AS TOTAL_NUM, SUM(LoanAmt) as LOAN_AMOUNT FROM V700_719 WHERE Flag = 1 
    union all 
    SELECT COUNT(loannumber) AS TOTAL_NUM, SUM(LoanAmt) as LOAN_AMOUNT FROM 720_739 WHERE Flag = 1 
    union 
    SELECT COUNT(loannumber) AS TOTAL_NUM, SUM(LoanAmt) as LOAN_AMOUNT FROM 740_759 WHERE Flag = 1; 
    run; 

UNIONは重複を除去する追加のオーバーヘッド(したがってソート)を招きます。 UNION ALLは重複を削除しません。

+0

私はそれを最初に試し、いくつかの検証チェックを実行し、それがうまくいった。大規模なサブセットをチェックアウトしたとき、私はそれが故障していることに気づいた。だから、組合はすべて私のために働かなかった。 –

+0

"out of order"? SQLの結果セットは*順不同です。あなたがそれらを特定の順序で望むなら、あなたは 'ORDER BY'を使う必要があります。ただし、データがどこから来るのかを指定する3番目の列を含めることをお勧めします。 –

+0

それは私が考え出したものです。ここに、http://stackoverflow.com/questions/21181664/sql-server-union-but-keep-orderを疑問に思う人のための詳細なリンクがあります。 –

3

ORDER BY句がSELECT文に含まれていない場合、照会された表で行が検出される順序など、出力行に対する特定の順序は保証されません。存在する。 ORDER BY句がないと、出力行の順序は、PROC SQLの内部処理、デフォルトのSASの照合順序、および操作環境によって決まります。したがって、結果表を特定の順序で表示する場合は、ORDER BY句を使用します。

http://support.sas.com/documentation/cdl/en/sqlproc/69049/HTML/default/viewer.htm#p1jr2es0aus2qtn11peo724tt8f4.htm

あなたのテーブルには、あなたの出力に注文されますが、テーブル内の行が同じである保証はありません。

関連する問題