2016-04-16 5 views
1

CROSS APPLYOUTER APPLYがクエリでさらに使用される場合、またはCROSS APPLYを追加する必要がある場合、文の最初の部分にGROUP BYを使用できますか?CROSS APPLYをさらに使用すると、最初のSELECTでGROUP BYを使用できますか?

select acc.custaccount, acc.product, acc.invoicedate 
from account acc 
join title t 
on acc.custaccount = t.custaccount 
***group by here*** 
Cross apply (select number, date 
from invoice inv where 
custaccount = acc.custaccount 
group by number, date) inv 

left join invoicedetail invdet 
on inv.number = invdet.number 

out apply(select invdet.number, invdet.units, invdet.value 
group by invdet.number, invdet.units, invdet.value) 
from 

etc..... 

答えて

1

私は単純に長い複雑なクエリを破ると思います。ここでは

は(私が本当のものをロードすることはできませんと)私は成功せずGROUP BYを追加しようとしました**のサンプルクエリですCommon-Table Expressions(CTE)を使用する部品。 WITHも参照してください。このような

何か:

WITH 
CTE1 
AS 
(
    select acc.custaccount, acc.product, acc.invoicedate 
    from 
     account acc 
     join title t on acc.custaccount = t.custaccount 
    ***group by here*** 
) 
,CTE2 
AS 
(
    SELECT ... 
    FROM 
     CTE1 
     Cross apply 
     (
      select number, date 
      from invoice inv 
      where inv.custaccount = CTE1.custaccount 
      group by number, date 
     ) AS A 
) 
SELECT ... 
FROM 
    CTE2 
    left join invoicedetail invdet on CTE2.number = invdet.number 
    outer apply 
    (
     select invdet.number, invdet.units, invdet.value 
     FROM ... 
     WHERE ... 
     group by invdet.number, invdet.units, invdet.value 
    ) AS A 
; 

ただ、クエリステップバイステップを構築し、各中間CTEの結果を検討します。

第1工程:

With 
CTE1 
as 
( 
    select fe.snap_name,fe.snap_accountid, fe.snap_entitlementcategory, fe.snap_entitlementcode, fi.invoicenumber, fi.totalamount 
    from 
     FilteredInvoice fi 
     join FilteredSNAP_entitlement fe on fi.accountid = fe.snap_accountid 
    group by fe.snap_name,fe.snap_accountid, fe.snap_entitlementcategory, fe.snap_entitlementcode, fi.invoicenumber, fi.totalamount 
) 
SELECT * 
FROM CTE1 
; 

第二ステップ:

With 
CTE1 
as 
( 
    select fe.snap_name,fe.snap_accountid, fe.snap_entitlementcategory, fe.snap_entitlementcode, fi.invoicenumber, fi.totalamount 
    from 
     FilteredInvoice fi 
     join FilteredSNAP_entitlement fe on fi.accountid = fe.snap_accountid 
    group by fe.snap_name,fe.snap_accountid, fe.snap_entitlementcategory, fe.snap_entitlementcode, fi.invoicenumber, fi.totalamount 
) 
SELECT * 
FROM 
    CTE1 
    CROSS APPLY 
    (
     select number, date 
     from invoice inv 
     where inv.custaccount = CTE1.custaccount 
     group by number, date 
    ) AS A 
; 

第三ステップ:

With 
CTE1 
as 
( 
    select fe.snap_name,fe.snap_accountid, fe.snap_entitlementcategory, fe.snap_entitlementcode, fi.invoicenumber, fi.totalamount 
    from 
     FilteredInvoice fi 
     join FilteredSNAP_entitlement fe on fi.accountid = fe.snap_accountid 
    group by fe.snap_name,fe.snap_accountid, fe.snap_entitlementcategory, fe.snap_entitlementcode, fi.invoicenumber, fi.totalamount 
) 
,CTE2 
AS 
(
    SELECT * 
    FROM 
     CTE1 
     CROSS APPLY 
     (
      select number, date 
      from invoice inv 
      where inv.custaccount = CTE1.custaccount 
      group by number, date 
     ) AS A 
) 
SELECT * 
FROM CTE2 
; 
+0

感謝。私は1つから始まり、次に追加します。私は 'と' はエラー「不正な構文が近い取得しています:CTE1 で FilteredInvoice Fiのから選択fe.snap_name、fe.snap_accountid、fe.snap_entitlementcategory、fe.snap_entitlementcode、fi.invoicenumber、fi.totalamount ( としてはFilteredSNAP_entitlementに参加します請求書 – yoda

+0

@yodaとしてfe.snap_name、fe.snap_accountid、fe.snap_entitlementcategory、fe.snap_entitlementcode、fi.invoicenumber、fi.totalamount )によってfi.accountid = fe.snap_accountid グループにFE 、Iは、ステップの詳細な例を追加しました私が心に持っていたこと。 –

関連する問題