SQL选择案例

use*_*048 5 sql vb.net

我有以下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
+-----------------+------------+------------+
Run Code Online (Sandbox Code Playgroud)

重新声明的数据表称为 result

 +-----------+----------+--------------+
| catalogid | numitems | ignoreditems |
+-----------+----------+--------------+
|       353 |        4 |            0 |
|       364 |       10 |            0 |
|       882 |        2 |            0 |
|       224 |        0 |            7 |
+-----------+----------+--------------+
Run Code Online (Sandbox Code Playgroud)

想法是对具有以下条件catalogidoitems表中数据具有相同描述的产品的numitems列求和

  1. 如果ocardtype为空则忽略numitems并将其视为0总和,并将忽略的项与ignoreditems 列相加
  2. 如果ocardtype由于某种顺序MasterCardVisaodate为空,则忽略numitems,并认为这是 0和总结的忽略项目到ignoreditems
  3. 如果ocardtypePaypalSofort,那么只需在numitems 不检查日期的情况下进行总结,因为这些类型不需要odate

基本上我想将结果数据表保存到临时数据表并将其加载到vb.net数据表

我很难搞清楚如何在SQL查询中执行此操作!我需要这个作为vb.net的sql命令,能够以编程方式使用vb.net datatables使用循环和很多使用linq检查是一个选项,但我只需要从服务器获取此

Ric*_*iwi 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
Run Code Online (Sandbox Code Playgroud)