1つのセルの値と同じ数の行を作成する<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />私はこの質問をどのように分類するのか、本当に知りませんでした。
私は、SQL ServerからデータをExcelを使って引き出す、そしてSQLのロジックとして、あらゆる場合に行が作成されます。この場合、機会は収容であり、それは "RoomNight"によって測定されます。したがって、"RoomNight"の肩は "1"の値で構成され、宿泊施設が300泊の場合、予約は300行になります。

しかし、私たちの予約管理者は時々間違いを犯していて、50泊の宿泊施設の結果は次のように見えます。

私がしなければならないのは、"RoomNight"に "1"、AdultNightに "2"の値を持つ50個の値のセルごとに50行を作成することです。
出来ますか?
1セルの値と同じ数の行を作成する以下を試してください、それはに基づいていますバブルプロット - 異なる時間間隔
これは1より大きい夜だけを増やします。
新しいテーブル( "RoomNight"、
行を追加する(15)
新しい列( "元の行の順序"、
数値、
連続した、
フォーマット( "最高"、12)、
設定値([1、2、3、4、5、6、7、8、9、10、11、12、13、14、15])
)
新しい列( "RoomNight"、
数値、
連続した、
フォーマット( "最高"、12)、
設定値([1、5、10、15、20、25、30、35、40、45、50、55、60、65、70])
)
新しい列( "AdultNight"、
数値、
連続した、
フォーマット( "最高"、12)、
設定値([2、10、20、30、40、50、60、70、80、90、100、110、120、130、140])
)
;
//何でもする前に夜と大人の人数を記録する
合計宿泊日数pre = Col Sum(:RoomNight);
大人の夜の合計pre = Col Sum(:AdultNight);
dt =現在のデータテーブル()。
rowN = N Row();
//元の各行について、各イベントの期間と同じ数の新しい行を生成します。
(i = 1、i <= rowN、i ++、
rowi = dt << get row(i);
(z = 1、z <=(:Name( "RoomNight")の場合 - 1)、z ++、
dt <<行を追加(rowi);
dt <<式を実行します。
;
;
//観測値を元の順序に並べ替える
データテーブル( "RoomNight")<<並べ替え((:元の行順)、順序(昇順)、表の置き換え);
//間違った数の夜に乗り過ぎる
:RoomNight <<各値を設定します(1);
:AdultNight <<各値を設定します(2);
待ちます(0)。
//新しいテーブルに合計宿泊数を記録する
トータルナイトポスト= Col Sum(:RoomNight);
合計大人の夜の投稿= Col Sum(:AdultNight);
//すべての合計が変更されていないことを確認します
表示する(合計夜前、合計大人夜前、合計夜投稿、合計大人夜投稿)。
1セルの値と同じ数の行を作成するすべてのプログラミングと同様に、実際には一連の手順にすぎません。
しかし、もちろんそれを効果的に使用するために何かを(完全に)理解する必要はないので、私はあなたが望むと思うことをするために変更を加えました。
[ファイル]> [新規]> [新規スクリプト]を実行してエディタウィンドウを開き、以下のコードをカットアンドペーストします。それから、'Edit> Run Script'を実行して、私が提供された簡単な例を使用して正しく理解したことを確認します(あなたがそれを実行するたびに異なります)
自分のデータで実行したい場合は、このテーブルがアクティブになっていることを確認してください。次に、以下のコードを次のように修正します。
- '//(1):'の後と '//(2)'の前のコードを1行に置き換えます。dt1 = CurrentDataTable();
- 自分のテーブル内の列の位置を反映するように、'//(3)'の直後の行の '3'と '4'を変更します。
このコードは、あなたのテーブルに数値カラムしか含まれていない場合にのみ機能します(あなたのもののように)。
これがあなた(または他の誰か)が日常的にやりたいことであれば、この複雑さを隠すためにアドインを作成するのはほんの少しの作業です。
そして、私は他の人が提供するかもしれないこれに対する解決策に非常に興味があるでしょう。英語で言っているように、「猫の皮をむく方法はたくさんあります」。。。
NamesDefaultToHere ( 1 ) ;
//行ve3ctorが 'inVec'の場合、inVecとそれ自身を 'inVec [1、pos]'で垂直方向に連結した行列を作成します
// 'outMat'という行列を返す。'outMat'の列 'pos'は1で構成されています。outMatの列 'numPos'には次のものが含まれます。
// 'inVec [1、numPos]'の値は、行の間で均等に分割されます
extrudeRow =
関数 ({ inVec 、 pos 、 numPos } 、 { デフォルトのローカル } 、
もし ( pos > 0 、
//「pos」は有効な場所ですか
回 = 円形 ( inVec [ 1 、 pos ] 、 0 ) ;
もし ( 回 > 0 、
//ベクトルを押し出します
outMat = J ( 回 、 NCol ( inVec ) 、 。 ) ;
にとって ( r = 1 、 r <= 回 、 r ++、
outMat [ r 、 0 ] = inVec ;
) ;
outMat [ 0 、 pos ] = 1 ;
outMat [ 0 、 numPos ] = inVec [ 1 、 numPos ] / 回 、
//そうでなければ何もしない
outMat = inVec ;
) 、
//そうでなければ何もしない
outMat = inVec ;
) ;
//結果を返す
outMat ;
) ;
//縦方向の連結で行列全体を押し出すには、'extrudeRow()'を使用します
extrudeTable =
関数 ({ inMat 、 pos 、 numPos } 、 { デフォルトのローカル } 、
もし ( pos > 0 、
//マトリックスを押し出します
newRows = 和 ( inMat [ 0 、 pos ]) ;
outMat = J ( newRows 、 NCol ( inMat ) 、 。 ) ;
rStart = 1 ;
にとって ( r = 1 、 r <= 今 ( inMat ) 、 r ++、
outMat [ rStart :: ( rStart + inMat [ r 、 pos ] - 1 ) 、 0 ] = extrudeRow ( inMat [ r 、 0 ] 、 pos 、 numPos ) ;
rStart = rStart + inMat [ r 、 pos ] ;
) 、
//そうでなければ何もしない
outMat = inMat ;
) ;
//結果を返す
outMat ;
) ;
//「extrudeTable()」の使用を表示します。。。
//(1):遊ぶテーブルを作る
dt1 = NewTable ( "データ" 、
NewColumn ( 「コラム1」 、数値 、序数 、式 ( RandomInteger ( - 5 、 5 ))) 、
NewColumn ( 「コラム2」 、数値 、序数 、式 ( RandomInteger ( - 5 、 5 ))) 、
NewColumn ( "周波数" 、数値 、序数 、式 ( RandomInteger ( 1 、 5 ))) 、
NewColumn ( "数" 、数値 、序数 、式 ( RandomInteger ( 1 、 20 ))) 、
AddRows ( 5 )
) ;
//(2):データを行列として取得する
mat1 = dt1 << getAsMatrix ;
//(3): 'Frequency'(3番目)列を使用してこの行列を押し出し、'Count'(4番目)列の値を平均する
mat2 = extrudeTable ( mat1 、 3 、 4 ) ;
//(4):mat2からテーブルを作成し、dt1と一致するように列名を修正します。
dt2 = AsTable ( mat2 ) ;
dt2 << setName ((( dt1 << getName ) || 「「周波数」により押し出されます」 ) ;
コルズ = dt1 << getColumnNames ( 「文字列」 ) ;
にとって ( c = 1 、 c <= NItems ( コルズ ) 、 c ++、カラム ( dt2 、 c ) << setName ( コルズ [ c ])) ;
1セルの値と同じ数の行を作成するありがとうイアン、
私の初心者のスキルのためにそれはロケット科学です。
1セルの値と同じ数の行を作成するこの古いコードはほぼあなたが望むことをします、そしてあなたが少しJSLを知っていればかなり簡単にあなたの特別な場合に適応させることができます。
NamesDefaultToHere ( 1 ) ;
//行ve3ctorが 'inVec'の場合、inVecとそれ自身を 'inVec [1、pos]'で垂直方向に連結した行列を作成します
// 'outMat'という行列を返す。'outMat'の列 'pos'は1で構成されています。
extrudeRow =
関数 ({ inVec 、 pos } 、 { デフォルトのローカル } 、
もし ( pos > 0 、
//「pos」は有効な場所ですか
回 = 円形 ( inVec [ 1 、 pos ] 、 0 ) ;
もし ( 回 > 0 、
//ベクトルを押し出します
outMat = J ( 回 、 NCol ( inVec ) 、 。 ) ;
にとって ( r = 1 、 r <= 回 、 r ++、
outMat [ r 、 0 ] = inVec ;
) ;
outMat [ 0 、 pos ] = 1 、
//そうでなければ何もしない
outMat = inVec ;
) 、
//そうでなければ何もしない
outMat = inVec ;
) ;
//結果を返す
outMat ;
) ;
//縦方向の連結で行列全体を押し出すには、'extrudeRow()'を使用します
extrudeTable =
関数 ({ inMat 、 pos } 、 { デフォルトのローカル } 、
もし ( pos > 0 、
//マトリックスを押し出します
newRows = 和 ( inMat [ 0 、 pos ]) ;
outMat = J ( newRows 、 NCol ( inMat ) 、 。 ) ;
rStart = 1 ;
にとって ( r = 1 、 r <= 今 ( inMat ) 、 r ++、
outMat [ rStart :: ( rStart + inMat [ r 、 pos ] - 1 ) 、 0 ] = extrudeRow ( inMat [ r 、 0 ] 、 pos ) ;
rStart = rStart + inMat [ r 、 pos ] ;
) 、
//そうでなければ何もしない
outMat = inMat ;
) ;
//結果を返す
outMat ;
) ;
//「extrudeTable()」の使用を表示します。。。
//(1):遊ぶテーブルを作る
dt1 = NewTable ( "データ" 、
NewColumn ( 「コラム1」 、数値 、序数 、式 ( RandomInteger ( - 5 、 5 ))) 、
NewColumn ( 「コラム2」 、数値 、序数 、式 ( RandomInteger ( - 5 、 5 ))) 、
NewColumn ( "周波数" 、数値 、序数 、式 ( RandomInteger ( 1 、 5 ))) 、
AddRows ( 5 )
) ;
//(2):データを行列として取得する
mat1 = dt1 << getAsMatrix ;
//(3): 'Frequency'(3番目)列を使用してこの行列を押し出します
mat2 = extrudeTable ( mat1 、 3 ) ;
//(4):mat2からテーブルを作成し、dt1と一致するように列名を修正します。
dt2 = AsTable ( mat2 ) ;
dt2 << setName ((( dt1 << getName ) || 「「周波数」により押し出されます」 ) ;
コルズ = dt1 << getColumnNames ( 「文字列」 ) ;
にとって ( c = 1 、 c <= NItems ( コルズ ) 、 c ++、カラム ( dt2 、 c ) << setName ( コルズ [ c ])) ;