3

Microsoft.ACE.OLEDB Driver を使用して Excel ファイルをクエリしています。結果は DataTable に渡されます。ただし、使用したい T-SQL クエリは、このドライバーではサポートされていません。

with abc as
(
SELECT Credit, Debit,[Reference 2] As [Job Code]
from xlSheet
WHERE ([Reference 2] LIKE '%JOB%') OR ([Reference 2] LIKE '%CRN%')
union all
SELECT Credit, Debit,[Reference] As [Job Code]
from xlSheet
WHERE ([Reference] LIKE '%JOB%') OR ([Reference] LIKE '%CRN%')
)
SELECT sum(Credit) as  Credit, sum(debit) as Debit,ABS(ROUND(SUM(Debit - Credit),2)) as Total , [Job Code],
            case when ROUND(SUM(Debit - Credit),2) < 0
                then 'JOB'
                else 'JOBR'
            end as 'Trans Code' 
from abc
group by [Job Code]
HAVING ROUND(SUM(debit - credit),2)  <> 0

したがって、これを次の 2 つのクエリに分割しました。

SELECT Credit, Debit,[Reference 2] As [Job Code]
    from xlSheet
    WHERE ([Reference 2] LIKE '%JOB%') OR ([Reference 2] LIKE '%CRN%')
    union all
    SELECT Credit, Debit,[Reference] As [Job Code]
    from xlSheet
    WHERE ([Reference] LIKE '%JOB%') OR ([Reference] LIKE '%CRN%')

そして2番目は:

SELECT sum(Credit) as  Credit, sum(debit) as Debit,ABS(ROUND(SUM(Debit - Credit),2)) as Total , [Job Code], 
            case when ROUND(SUM(Debit - Credit),2) < 0 
                then 'JOB' 
                else 'JOBR' 
            end as 'Trans Code'  
from abc 
group by [Job Code] 
HAVING ROUND(SUM(debit - credit),2)  <> 0 

これで、DataTable に対して基本的な選択クエリを実行できることがわかりましたが、これほど複雑なものはありません。LINQ について聞いたことがありますが、これを介して実行できると確信しています。しかし、LINQ に慣れていないので、この点に関して助けが必要です。これに失敗した場合、結果をセカンダリ Excel ファイルに書き戻し、セカンダリ クエリでファイルを再度読み取るしか方法がありませんが、これには大きなパフォーマンス上の欠点があります。

4

2 に答える 2

1

LINQ を紹介する LINQ in Action の無料の章と、始めるために何かが必要な場合は、LINQ to DataSets (DataTable に使用する) について説明するボーナスの第 14 章があります。それらはhttp://www.manning.com/marguerie/で読むことができます。

于 2012-09-10T18:37:53.360 に答える
0

だから私は次のようにLinqtoDataTableを使用してクエリを解決しました:

        var result = from b in dsXLData.Tables[0].AsEnumerable()
                     group b by b.Field<string>("cJobCode")  into grp
                     where grp.Sum(e => Math.Round(e.Field<Double>("debit"),2) - Math.Round(e.Field<Double>("credit"),2)) != 0
                     select new
                     {
                         cJobCode = grp.Key,
                         Credit = Math.Round(grp.Sum(x => x.Field<Double>("credit")), 2),
                         Debit = Math.Round(grp.Sum(x => x.Field<Double>("debit")), 2),
                         Amount_Incl = Math.Round(Math.Abs(grp.Sum(x => x.Field<Double>("debit")) - grp.Sum(x => x.Field<Double>("credit"))), 2),
                         Trans_Code =
                                (
                                    Math.Round(grp.Sum(x => x.Field<Double>("debit")) - grp.Sum(x => x.Field<Double>("credit")), 2) < 0 ? "JOB" : "JOBR"
                                )

                     };
于 2012-09-11T07:37:38.420 に答える