2016-10-28 3 views
1

Я занимаюсь объединением нескольких операторов выбора, основанных на разных таблицах. Проблема заключается в том, что вывод автоматически сортируется по столбцу TOTAL_NUM вместо того, чтобы оставаться в том порядке, в котором я сделал соединение. Есть ли способ избежать этого?Как предотвратить сортировку в proc sql union в SAS?

Вот пример моего кода.

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

"не в порядке"? SQL-результирующие наборы * неупорядочены *. Если вы хотите, чтобы они были в определенном порядке, вам нужно использовать 'ORDER BY'. Однако вместо этого я рекомендовал бы включить третий столбец, в котором указывается, откуда поступают данные. –

+0

Вот что я понял. Вот ссылка, показывающая это более подробно для всех, кто интересуется http://stackoverflow.com/questions/21181664/sql-server-union-but-keep-order. –

3

Если заказ по п не входит в ЗЕЬЕСТ, то конкретный порядок в выходных строк, таких как порядок, в котором строки встречаются в запрошенной таблице, не может быть гарантирована, даже если индекс настоящее. Без предложения ORDER BY порядок выходных строк определяется внутренней обработкой PROC SQL, последовательностью сопоставления по умолчанию SAS и вашей операционной средой. Поэтому, если вы хотите, чтобы таблица результатов отображалась в определенном порядке, используйте предложение ORDER BY.

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

ваши таблицы будут упорядочены в вашем выводе, но нет никакой гарантии, что строки внутри таблицы одинаковы.