2010-12-16 12 views
0

私はいくつかの汎用データ保持者列を持つテーブルを持っていると言いましょう(文字列型を使用するように選択された元のコードの開発者です)。これらの列は、すべての数値、英数字またはそれらの組み合わせを保持できます。varcharベースの共関連サブクエリでの数値の順序付け

私は、私のような共同関連のサブクエリを持っているとしましょう。

SOME_CORELATED_QUERY=(SOME SELECT SQL) 

私はorder by節を持っているとしましょう。

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. 

だから私は私の問題のために実行可能であるが、問題は、私は一緒に関連サブクエリにそれを適用することができないということですbasiclyスペースを使用するソリューションhereを見つけました。

私がテーブルの列IDにそれを適用しようとすると、すべて正常に動作します。

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関数で認識されていないので、私はエラーメッセージを取得し、キャスト、などを変換:

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でも作業しています。

更新:Bradのおかげで、私は仮想カラムよりも優れた説明であるため、 'co-related subqueries'を使用するように質問テキストを更新しました。

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 

と私は文字データの使用ORDER BY LEN(columnName), columnNameの数字の順序についてPROPERTY_VALUE_NAME1、PROPERTY_VALUE_NAME2と..だから

+1

私はこれらの "仮想列"を "共同関連のサブクエリ " – Brad

+0

クエリの実際のサンプルを投稿できる場合は、多くの助けになります。 (多くの場合、人々は自分のオブジェクトの名前を "MyTable"や "Col1、Col2"などに変更して自分の仕事を匿名化します) –

+2

このコードは非常に間違っています。まず、暗黙の左結合(アスタリスク付き結合)を使用しないでください。 SQL Serverは時にはそれが左結合であると考える場合があり、時には十字結合であると考えているため、正しい結果が確実に得られません。これは、SQL Server 2000とは異なり、この構文は推奨されていません。正しく動作しないため、使用しないでください。とにかく、暗黙の結合を使用するべきではありません。次に、これらの相関サブクエリはパフォーマンス・キラーであり、結合で置き換える必要があります。それらは行ごとに実行され、使用することはほとんどありません。 – HLGEM

答えて

0

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

を動作する可能性があり、このような何かうまくいけば、これはそれを行うだろう最初の数値を数値順にソートし、グループ内のアルファ値を-1でグループ化し、2番目の部分でアルファで並べ替えます。

0

にソートします。私が手にインスタンスを持っていないとしてではなく、それはあなたがそれにcase文を使用できるようになります場合、私はそれをテストすることはできません

関連する問題