1

アイテムグループごとに上位10個のアイテムのリストを生成できるクエリを作成しようとしています。これは、すべてのアイテムがアイテムグループに分割されるスーパーマーケットチェーン用です。例:米、塩など。米にはさまざまなブランドがあり、塩にはさまざまなブランドがあります。

SAP Business Oneテーブル(MS SQL Server 2008)からデータを取得する必要があります

アイテムグループテーブルOITBのサンプル結果

SELECT * FROM OITB(アイテムグループの最初の2列を表示)

ItmsGrpCod  ItmsGrpNam
101         RICE
102         SALT
103         SUGAR
104         FROZEN VEGETABLE

これにより、224件の結果が返されます。

SELECT * FROM OITB(アイテムの最初の2列を表示)

ItemCode    ItemName          ItmsGrpCod    
2001        A1 GRAIN RICE     101
2001        ASHA BRAND RICE   101
2003        PISHORI RICE      101
2004        B7 GRADE RICE     101
2019        JIM SALT          102
2020        KAYKAY SALT       102

上位10個のアイテムを取得するこのクエリも以下にありますが、アイテムグループコード(フィールドItmsGrpCod)を指定する必要があります

SELECT TOP 100 T0.ItemCode, T0.ItemName, T1.DocDate, T6.Price AS COST,P3.Price AS POS,
((P3.Price-T6.Price)/T6.Price)*100 AS [Markup %], T2.OnHand, SUM(T1.Quantity) 
AS Quantity, SUM(T1.LineTotal) AS SALES,T6.Price *SUM(T1.Quantity) AS [Sales 
Cost],SUM(T1.LineTotal) - T6.Price *SUM(T1.Quantity) AS [GP Amount],
(SUM(T1.LineTotal) - T6.Price *SUM(T1.Quantity))/(T6.Price *SUM(T1.Quantity))
*100 as [GP %],T3.WhsName FROM OITM T0
INNER JOIN INV1 T1 ON T0.ItemCode = T1.ItemCode 
INNER JOIN OITW T2 ON T0.ItemCode = T2.ItemCode 
INNER JOIN OWHS T3 ON T1.WhsCode = T3.WhsCode 
INNER JOIN OINV T4 ON T1.DocEntry = T4.DocEntry 
INNER JOIN OITB T5 ON T0.ItmsGrpCod = T5.ItmsGrpCod 
INNER JOIN ITM1 T6 ON T0.ItemCode = T6.ItemCode  
INNER JOIN (SELECT P1.ItemCode, P2.Price FROM OITM P1 
INNER JOIN ITM1 P2 ON P1.ItemCode=P2.ItemCode WHERE 
P2.PriceList='1') P3 ON P3.ItemCode=T0.ItemCode WHERE T6.PriceList ='2' 
AND T2.WhsCode = '01' AND T1.WhsCode = '01' AND T4.DocDate 
= CONVERT(VARCHAR, GETDATE() -1, 101)
AND T0.ItmsGrpCod = '103'  --(Item Group Code)
GROUP BY T0.ItemCode, T0.ItmsGrpCod, T0.ItemName, T1.DocDate, T6.Price, P3.Price, ((P3.Price-T6.Price)
/NULLIF(T6.Price, 0))* 100, T2.OnHand, T3.WhsName ORDER BY Quantity DESC

必要なのは、最初にOITBからすべてのアイテムグループコードを取得し、それらを一時的に配列に格納してから、各アイテムグループコードに対して2番目のクエリを実行するクエリです。各アイテムグループに少なくとも10個のアイテムがあるとすると、クエリは2240件の結果を返すはずです。ただし、一部のアイテムグループには10未満のアイテムがあります。私は実際にSQlで配列を使用したことがないので、必要なものを取得するためのクエリをどのように作成しますか?助けていただければ幸いです。

4

2 に答える 2

4

私はこの声明が役立つと思います:

Create table OITB (itmsGrpCod int ,ItmsGrpNam varchar(30) )

insert into OITB select 101,'RICE'
insert into OITB select 102,'SALT'
insert into OITB select 103,'SUGAR'
insert into OITB select 104,'FROZEN VEGETABLE'



Create table Item (ItemCode int ,ItemName varchar(20),ItmsGrpCod int )

insert into Item select 1011,'A RICE',101
insert into Item select 1012,'B RICE',101
insert into Item select 1013,'C RICE',101
insert into Item select 1014,'D RICE',101
insert into Item select 1015,'E RICE',101
insert into Item select 1016,'F RICE',101
insert into Item select 1017,'G RICE',101
insert into Item select 1018,'H RICE',101
insert into Item select 1019,'I RICE',101
insert into Item select 10111,'J RICE',101
insert into Item select 10112,'K RICE',101
insert into Item select 10113,'L RICE',101
insert into Item select 10114,'M RICE',101
insert into Item select 1020,'A SALT',102
insert into Item select 1021,'B SALT',102
insert into Item select 1042,'C SALT',102





WITH recordsList
AS
(
    SELECT  Item.*,
            ROW_NUMBER() OVER (PARTITION BY ItmsGrpNam
                                ORDER BY Item.itmsGrpCod ) rn
    FROM    OITB
  inner join 
  Item on OITB.ItmsGrpCod=Item.ItmsGrpCod
)
SELECT  *
FROM    recordsList
WHERE   rn <= 10
于 2013-01-28T07:11:35.257 に答える
1

OITMスキーマとOITBスキーマをグーグルで検索しました。

OITBをグループとアイテムの両方のエンティティとして誤って説明されていることを理解しました。

私の調査結果から:

  • OITB-製品グループ
  • OITM-製品アイテム
  • INV1-在庫

したがって、Raviのソリューションを拡張すると、これでうまくいくはずです。

WITH OITB_OITM AS
(
  SELECT
    OITB.ItmsGrpCod, OITB.ItmsGrpNam,
    OITM.ItemCode, OITM.ItemName,
    INV1.Quantity,
    ROW_NUMBER() OVER
    (
      PARTITION BY OITB.ItmsGrpNam
      ORDER BY
        INV1.Quantity DESC,
        OITM.ItemName /* For clashing quantities */
    ) idx
  FROM
    OITM
      INNER JOIN INV1 ON INV1.ItemCode   = OITM.ItemCode
      INNER JOIN OITB ON OITB.ItmsGrpCod = OITM.ItmsGrpCod
)
SELECT *
FROM OITB_OITM
WHERE idx <= 10
于 2013-02-02T07:36:27.940 に答える