2012-10-01 3 views
1

나는SQL 추가 기능은 쉼표로 구분 된 하나의 셀 ID를 처리

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 

아래의 설명을 읽어 보시기 바랍니다 무엇의 아이디어를 다음과 같은 SQL 테이블을 얻기 위해 다음과 같은 SQL 쿼리를

oitems 테이블

+---------+-----------+----------+ 
| 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 테이블

+-----------------+------------+------------+ 
    |   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 
    +-----------------+------------+------------+ 

reusltant 데이터 테이블

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

아이디어는 무시 ocardtype가 비어

  1. 경우 다음과 같은 조건으로 oitems 테이블의 데이터에 depinding 같은 catalogId에이 제품에 대한의 numItems 열을 요약하는 것입니다 numitems과 합계로 0 으로 간주하고 일부 주문에 대해 ocardtype이 Ma 인 경우 무시 된 항목을 ignoreditems
  2. sterCard 또는 비자와 odate이 가 비어 후 numitems을 무시하고 0로 고려하고 ignoreditems
  3. ocardtype 페이팔 또는 Sofort 경우에 무시 항목을 합계 한 후 바로 odate 인해를 확인하지 않고 numitems 합 을 그 종류는 내가 열 이 열이 나는 하려는 위의 표에서 orderids을 포함, ignoredoid 불렀다 예약라는 다른 테이블에 odate
  4. 3 조건이 위 satsfied 경우에도을 무시 필요하지
  5. 이 점에

는 쿼리에 그의 대답에 일명 cyberkiwi를 @ 리차드 완벽 덕분 노력이 question 질문은

, 나는 다음과 같은

+-----------+----------+--------------+-------------------+ 
| catalogid | numitems | ignoreditems | orderidcollection | 
+-----------+----------+--------------+-------------------+ 
|  353 |  4 |   0 | O737,O739   | 
|  364 |  10 |   0 | O738,O740   | 
|  882 |  2 |   0 | O741    | 
|  224 |  0 |   7 |     |'O742 & O743 are ignored  
+-----------+----------+--------------+-------------------+ 
같이하는 데이터 테이블 결과를 필요


orderidcollection 열의 유일한 변경 사항을 볼 수 있듯이 orderid을 코드에서 무시되지 않는 경우에만 쉼표로 구분 된 새 열에 추가해야합니다. 운이없는 한 쌍의 시간 동안 인터넷 검색! 은 SQL에서도 가능합니까?

+2

어떤 데이터베이스가 있습니까? 이를위한 솔루션은 데이터베이스와 관련 될 수 있습니다. – HLGEM

+0

@HLGEM Microsoft SQL Server 및 vb.net에서이 qury를 실행하고 있으며 SQL과의 내 experiance는 거의 0입니다. – user1570048

+1

@ user1570048, SQL Server의 버전은 무엇입니까? –

답변

1
이 하나 (LINQpad 쿼리)로 확장 이전 질문에 대한 내 Linq에-에-SQL 대답

:

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 _ 
     numitems = Sum(If(check, i.numitems, 0)), _ 
     ignoreditems = Sum(If(check, 0, i.numitems)), _ 
     group 
     Select catalogid, numitems, ignoreditems, _ 
      orderidcollection = String.Join(",", (From g in group Where g.check Select g.i.orderid)) 
result.Dump 

참고이 솔루션은 각 catalogidcheck에 대한 orderids을 결정하기 위해 여러 SQL 쿼리를 발행가 True입니다 각 orderidcollection 누적하십시오.더 효율적인 솔루션이있을 수 있습니다 (아마도 회귀 된 Linq-to-Sql을 사용하여 생성 된 SQL이 String.Join과 동등하거나 Linq-to-Sql을 사용하여 catalogid, numitems, check, orderid을 얻은 다음 Linq-to-objects를 사용합니다 최종 축적을하기 위해).

또한이 쿼리에는 Booked 테이블 (LINQpad의 복수형 포함)이 포함됩니다.