Числовое упорядочение на основе подзапросов на основе varchar - PullRequest
0 голосов
/ 16 декабря 2010

позвольте мне сказать, что у меня есть таблица с некоторыми столбцами обобщенных носителей данных (так что, похоже, разработчик исходного кода выбрал использование строкового типа).Эти столбцы могут содержать все числовые, буквенно-цифровые или их сочетания.

Позвольте мне сказать, что у меня есть подобный подзапрос типа;

SOME_CORELATED_QUERY=(SOME SELECT SQL)

и скажем, что у меня есть порядок по пунктам;

order by ID,SOME_CORELATED_QUERY

теперь, так как все эти поля основаны на varchar, я не могу получить их по умолчанию для числовой сортировки.

Я могу попробовать это для моего связанного подзапроса;

SOME_CORELATED_QUERY=cast((SOME SELECT SQL) as int)

, но проблема с вышеупомянутым состоит в том, что не все мои данные являются числовыми, и я получу ошибку;

Conversion failed when converting the varchar value '304L' to data type int.

Итак, я нашел решение здесь , которое в основном использует пробелы, которые жизнеспособны для моей проблемы, но проблема в том, что я не могу применить его к сопутствующему подзапросу.

Если я попытаюсь применить его к моему идентификатору столбца таблицы, все будет работать нормально;

order by space(50-len(ID))+ID, SOME_CORELATED_QUERY

, но это не поможет, потому что мне нужна числовая сортировка на моем SOME_CORELATED_QUERY.Я пытаюсь это сделать так:

order by space(50-len(SOME_CORELATED_QUERY))+SOME_CORELATED_QUERY

, но я получаю сообщение об ошибке, потому что мой подзапрос в некоторой степени не распознается такими функциями SQL, как space, cast, convert и т. Д .:

Msg 207, Level 16, State 1, Line 48
Invalid column name 'SOME_CORELATED_QUERY'.
Msg 207, Level 16, State 1, Line 48
Invalid column name 'SOME_CORELATED_QUERY'.

Поэтому в основном мне нужен способ использования функционального пространства SQL, приведение, преобразование в моем связанном подзапросе во время сортировки.

Примечание. При изменении макета базы данных тип поля невозможен, так как макет сложен.написано в программе, которую я использую, я просто создаю отчеты на основе SQL для пользователя.

  • Я также работаю над mssql2005.

Обновление: спасибо Брэду, я обновил текст вопроса, чтобы использовать «связанные подзапросы», так как это было лучшее описание, чем виртуальные столбцы.

Update2: вот полный sql, как его просили;

select ID, S.STOCK_ID ,S.STOCK_CODE,S.STOK_SHORT_NAME,S.UNIT1_NAME UNIT_NAME,

  PROPERTY_VALUE_NAME1=(Select PROPERTY_VALUE from STOCK_PROPERTY_VALUES where  PROPERTY_VALUE_ID=a.PROPERTY_VALUE_ID_1),
  PROPERTY_NAME1=(Select PROPERTY_NAME from STOCK_PROPERTY_DEFINITIONS SOT, STOCK_PROPERTY_TEMPLATES SOS where SOS.PROPERTY1_ID=SOT.PROPERTY_ID and SOS.ID=a.ID),

  PROPERTY_VALUE_NAME2=(Select PROPERTY_VALUE from STOCK_PROPERTY_VALUES where  PROPERTY_VALUE_ID=a.PROPERTY_VALUE_ID_2),
  PROPERTY_NAME2=(Select PROPERTY_NAME from STOCK_PROPERTY_DEFINITIONS SOT,STOCK_PROPERTY_TEMPLATES SOS where SOS.PROPERTY2_ID=SOT.PROPERTY_ID and SOS.ID=a.ID),

  PROPERTY_VALUE_NAME3=(Select PROPERTY_VALUE from STOCK_PROPERTY_VALUES where  PROPERTY_VALUE_ID=a.PROPERTY_VALUE_ID_3),
  PROPERTY_NAME3=(Select PROPERTY_NAME from STOCK_PROPERTY_DEFINITIONS SOT,STOCK_PROPERTY_TEMPLATES SOS where SOS.PROPERTY3_ID=SOT.PROPERTY_ID and SOS.ID=a.ID),

  PROPERTY_VALUE_NAME4=(Select PROPERTY_VALUE from STOCK_PROPERTY_VALUES  where  PROPERTY_VALUE_ID=a.PROPERTY_VALUE_ID_4),
  PROPERTY_NAME4=(Select PROPERTY_NAME from STOCK_PROPERTY_DEFINITIONS SOT,STOCK_PROPERTY_TEMPLATES SOS where SOS.PROPERTY4_ID=SOT.PROPERTY_ID and SOS.ID=a.ID),

  PROPERTY_VALUE_NAME5=(Select PROPERTY_VALUE from STOCK_PROPERTY_VALUES where  PROPERTY_VALUE_ID=a.PROPERTY_VALUE_ID_5),
  PROPERTY_NAME5=(Select PROPERTY_NAME from STOCK_PROPERTY_DEFINITIONS SOT,STOCK_PROPERTY_TEMPLATES SOS where SOS.PROPERTY5_ID=SOT.PROPERTY_ID and SOS.ID=a.ID),

  PROPERTY_VALUE_NAME6=(Select PROPERTY_VALUE from STOCK_PROPERTY_VALUES where  PROPERTY_VALUE_ID=a.PROPERTY_VALUE_ID_6),
  PROPERTY_NAME6=(Select PROPERTY_NAME from STOCK_PROPERTY_DEFINITIONS SOT,STOCK_PROPERTY_TEMPLATES SOS where SOS.PROPERTY6_ID=SOT.PROPERTY_ID and SOS.ID=a.ID),

  PROPERTY_VALUE_NAME7=(Select PROPERTY_VALUE from STOCK_PROPERTY_VALUES where  PROPERTY_VALUE_ID=a.PROPERTY_VALUE_ID_7),
  PROPERTY_NAME7=(Select PROPERTY_NAME from STOCK_PROPERTY_DEFINITIONS SOT,STOCK_PROPERTY_TEMPLATES SOS where SOS.PROPERTY7_ID=SOT.PROPERTY_ID and SOS.ID=a.ID),

  isnull(SUM(case IN_OUT when 1 then UNIT1_VALUE else 0 end),0) IN_VALUE,
  isnull(SUM(case IN_OUT when 2 then UNIT1_VALUE else 0 end),0) OUT_VALUE

    from STOCK_PROPERTY_DETAILS a, STOCK b, STOCK_TRANSACTION_ROWS DHS, STOCK S, WAREHOUSE D 

    where a.STOCK_ID=b.STOCK_ID   and  b.STOCK_ID *= DHS.SHD_ID   and  DHS.SHD = 1 and ID>0 and B.UPPER_STOCK_ID=S.STOCK_ID and D.WAREHOUSE_ID*=DHS.WAREHOUSE_ID

    group by S.STOCK_ID ,S.STOCK_CODE,S.STOK_SHORT_NAME,S.UNIT1_NAME, PROPERTY_VALUE_ID_1,PROPERTY_VALUE_ID_2,PROPERTY_VALUE_ID_3,PROPERTY_VALUE_ID_4,PROPERTY_VALUE_ID_5,PROPERTY_VALUE_ID_6,PROPERTY_VALUE_ID_7,ID

    having 1=1 and ((isnull(SUM(case IN_OUT when 1 then UNIT1_VALUE else 0 end),0)-isnull(SUM(case IN_OUT when 2 then UNIT1_VALUE else 0 end),0)<>0 /*##ZERO#*/) or (not(1=1 /*##ZERO#*/)))

    order by   ID,PROPERTY_VALUE_NAME1,PROPERTY_VALUE_NAME2,PROPERTY_VALUE_NAME3,PROPERTY_VALUE_NAME4,PROPERTY_VALUE_NAME5,PROPERTY_VALUE_NAME6,PROPERTY_VALUE_NAME7

И я хочу отсортировать по PROPERTY_VALUE_NAME1, PROPERTY_VALUE_NAME2 и т. Д.

Ответы [ 2 ]

0 голосов
/ 16 декабря 2010

Я не могу протестировать его, так как у меня нет экземпляра в руках, но если он позволит вам использовать оператор case, то это может сработать

order by
   case 
      when isnumeric(columnname) then cast(columnname as int) 
      else -1 
   end,
   columnname

Надеюсь, это будет сделано в двух видах: первая сортировка числовых значений в числовом порядке и объединение альфа-содержимого в группе в -1, которое затем будет отсортировано по альфе по нашей второй части

0 голосов
/ 16 декабря 2010

Для числового упорядочения символьных данных используйте ORDER BY LEN(columnName), columnName.

...