5

私は次のSQLテーブルを持っています

oitems table

    +---------+-----------+----------+
    | orderid | catalogid | numitems |
    +---------+-----------+----------+
    | O737    |       353 |        1 |
    | O738    |       364 |        4 |
    | O739    |       353 |        3 |
    | O740    |       364 |        6 |
    | O741    |       882 |        2 |
    | O742    |       224 |        5 |
    | O743    |       224 |        2 |
    +---------+-----------+----------+

Orders table
+-----------------+------------+------------+
|         orderid | ocardtype  |   odate    |
+-----------------+------------+------------+
|     O737        | Paypal     |            | 'OK
|     O738        | MasterCard | 01.02.2012 | 'OK
|     O739        | MasterCard | 02.02.2012 | 'OK
|     O740        | Visa       | 03.02.2012 | 'OK
|     O741        | Sofort     |            | 'OK
|     O742        |            |            | 'ignore because ocardtype is empty
|     O743        | MasterCard |            | 'ignore because Mastercard no odate
+-----------------+------------+------------+

と呼ばれる再利用可能なデータテーブルresult

 +-----------+----------+--------------+
| catalogid | numitems | ignoreditems |
+-----------+----------+--------------+
|       353 |        4 |            0 |
|       364 |       10 |            0 |
|       882 |        2 |            0 |
|       224 |        0 |            7 |
+-----------+----------+--------------+

アイデアは、次の条件でテーブルcatalogid内のデータに同じデピンが設定されている製品のnumitems列を合計することです。oitems

  1. ocardtype空の場合は、を無視して合計numitemsと見なし、無視された項目を 列に合計します0ignoreditems
  2. ocardtypeある順序がMasterCardまたはVisaodate空の場合は、を無視してそれnumitemsを考慮し 、無視された項目を列0に合計しますignoreditems
  3. ocardtypeisPaypalまたはSofort、の場合numitems 、これらのタイプは必要がないため、日付を確認せずに合計を実行します。odate

基本的に、結果のデータテーブルを一時的なデータテーブルに保存し、それをvb.netデータテーブルにロードしたいと思います

私はSQLクエリでこれを行う方法を理解するのに苦労しています!私はこれをvb.netのsqlコマンドとして必要とし、ループを使用してvb.netデータテーブルを使用してプログラムで実行でき、linqを使用して多くのチェックを行うことはオプションですが、サーバーからこれを取得する必要があります

4

3 に答える 3

1
select catalogid, numitems, allitems - numitems ignoreditems
from (
  select i.catalogid,
    sum(case when (ocardtype in ('PayPal','Sofort') OR
                   ocardtype in ('mastercard','visa') and
                   odate is not null) AND NOT EXISTS (
                     select * from booked b
                     where b.ignoredoid = o.orderid
                   ) then numitems
                   else 0 end) numitems,
    sum(numitems) allitems
  from orders o
  join oitems i on i.orderid=o.orderid
  group by i.catalogid
) X
于 2012-10-01T06:54:39.957 に答える
1

何かのようなもの:

SELECT
     oi.catalog_id,
     SUM(CASE
            WHEN ocardtype in ('Paypal','Sofort') THEN numitems
            WHEN ocardtype in ('Mastercard','Visa') and odate is not null THEN numitems
            ELSE 0 END) as numitems,
     SUM(CASE
            WHEN ocardtype is null then numitems
            WHEN ocardtype in ('Mastercard','Visa') and odate is null THEN numitems
            ELSE 0 END) as ignoreditems
FROM
   oitems oi
      inner join
   Orders o
      on
         oi.orderid = o.orderid
GROUP BY
   oi.catalog_id

(物語の中で「空」という言葉をどこでも使用したと仮定すると、列が であることを意味しますNULL

于 2012-10-01T06:53:10.520 に答える
1

元のリクエストの Linq-to-sql バージョンを次に示します (LINQpad クエリとして)。

Dim odateRequired = {"MasterCard", "Visa"}
Dim odateNotRequired = {"Paypal", "Sofort"}
Dim result = From o In Orders Join i In Oitems On o.orderid Equals i.orderid _
             Let check = o.ocardtype IsNot Nothing _
                     AndAlso ((odateRequired.Contains(o.ocardtype) _
                               AndAlso o.odate IsNot Nothing) _
                        OrElse odateNotRequired.Contains(o.ocardtype)) _
         Group By i.catalogid Into _
         numitem = Sum(If(check, i.numitems, 0)), _
         ignored = Sum(If(check, 0, i.numitems))

result.Dump

RichardTheKiwi の回答へのコメントでの追加のリクエスト (Not (From b In Bookeds Where b.ignoredoid=i.orderid).Any AndAlsoの前に含まれているだけですcheck):

Dim odateRequired = {"MasterCard", "Visa"}
Dim odateNotRequired = {"Paypal", "Sofort"}
Dim result = From o In Orders Join i In Oitems On o.orderid Equals i.orderid _
             Let check = Not (From b In Bookeds Where b.ignoredoid = i.orderid).Any _
                     AndAlso o.ocardtype IsNot Nothing _
                     AndAlso ((odateRequired.Contains(o.ocardtype) _
                               AndAlso o.odate IsNot Nothing) _
                        OrElse odateNotRequired.Contains(o.ocardtype)) _
         Group By i.catalogid Into _
         numitem = Sum(If(check, i.numitems, 0)), _
         ignored = Sum(If(check, 0, i.numitems))

result.Dump
于 2012-10-02T10:34:39.190 に答える