0

次のクエリがあります。

select 
     ii.customer
     , CONVERT(DECIMAL(20,2),ISNULL((Select SUM(gld.amount) where inv.inventorydepartmentid='B00H'),0.00)) AS CD
     ,CONVERT(DECIMAL(20,2),ISNULL((Select SUM(gld.amount) where inv.inventorydepartmentid='A00G'),0.00)) AS Cam
from 
    invoiceitemview ii with (nolock)
inner join 
    master m with(nolock) on m.masterid=ii.masterid
inner join 
    warehouse w with (nolock) on w.warehouseid=ii.warehouseid
inner join 
    category c on c.categoryid=m.categoryid
inner join 
    gl on gl.invoiceitemid=ii.invoiceitemid
inner join 
    inventorydepartment inv on inv.inventorydepartmentid = c.inventorydepartmentid
inner join 
    gldetail gld on gld.warehouseid = w.warehouseid and gl.glid = gld.glid 
                 and m.masterid = gld.masterid
where 
    gl.gldate between @StartDate and @EndDate
    and ii.status IN ('CLOSED', 'PROCESSED')
    and w.warehouseid = '01'
    and w.inactive <> 'T'
    and ii.customerno = 'T1'
group by 
    ii.customer

inv.inventorydepartmentidただし、 group by 句に含めていないため、これは実行されません。ただし、それを行うと、次のように同じ顧客の 2 行が表示されます。

Customer1     0.00   120.00
Customer1   500.00     0.00

それ以外の

Customer1   500.00   120.00

助言がありますか?

4

2 に答える 2

1

select次の構文を試してください。

select ii.customer,
       CONVERT(DECIMAL(20,2),
               ISNULL(SUM(case when inv.inventorydepartmentid='B00H' then gld.amount end),
                      0.00
                     )
              ) AS CD,
       CONVERT(DECIMAL(20,2),
               ISNULL(SUM(case when inv.inventorydepartmentid='A00G' then gld.amount end),
                      0.00
                     )
              ) AS Cam

条件付き集計を行っています。ネストされた は必要ありませんselectcaseステートメントを正しく使用するだけで済みます。

ところで、ネストされたサブクエリでwhere句がなく、from. 巧妙なアプローチ (この場合は機能しませんが)。これが許容される構文であることを認識していませんでした。

于 2013-10-31T20:37:40.313 に答える
0

派生テーブルを試してみませんか。たとえば、CustomerID と金額を選択し、新しい SELECT ステートメントで集計を行います。また、派生テーブル (または cte) 内に書き込むのではなく、select の最後にグループ化を行います。現時点では、customerID と departmentID の両方でグループ化しているため、顧客ごとに 2 つの結果が得られています。これは、クエリによってすべての組み合わせが実行されていることを意味します。つまり、クロス結合のように機能するため、同じ customerID を 2 回取得します。departmentid= 'B00H' の customerID があり、次に dedpartmentid= 'A00G' の同じ customerID がある場合

with cte as (
select 
ii.customer
,gld.amount

from 
invoiceitemview ii with (nolock)
inner join master m with(nolock) on m.masterid=ii.masterid
inner join warehouse w with (nolock) on w.warehouseid=ii.warehouseid
inner join category c on c.categoryid=m.categoryid
inner join gl on gl.invoiceitemid=ii.invoiceitemid
inner join inventorydepartment inv on inv.inventorydepartmentid = c.inventorydepartmentid
inner join gldetail gld on gld.warehouseid=w.warehouseid and gl.glid=gld.glid and  m.masterid=gld.masterid
where 
gl.gldate between @StartDate and @EndDate
and ii.status IN ('CLOSED', 'PROCESSED')
and w.warehouseid='01'
and w.inactive<>'T'
and ii.customerno='T1'
)

select customer
,(select CONVERT(DECIMAL(20,2),ISNULL((Select SUM(gld.amount) from inventorydepartment inv (SOME KIND OF JOIN IS REQUIRED) where inv.inventorydepartmentid='B00H'),0.00))) AS CD
,(select CONVERT(DECIMAL(20,2),ISNULL((Select SUM(gld.amount) from inventorydepartment inv (SOME KIND OF JOIN IS REQUIRED) where inv.inventorydepartmentid='A00G'),0.00))) AS Cam
  from cte
  group by customer
于 2013-10-31T21:00:16.327 に答える