2016-10-26 13 views
1

私はSQL Serverで作業しています。私はクエリで助けが必要です。GROUP BY 1つのレコードで

これはシナリオです。

私は2つのテーブルForecastOrdersを持っています。

いくつかのフィールドが両方のテーブルで一致し、他のフィールドが一致しません。

私はSELECTでそれらのすべてを持つことができるかどうかは関係ありません。

ただし、常に一致するフィールドは2つあります。 IDおよびSKU

最初にLEFT JOINを使用しようとしましたが、IDSKUに1つの列が必要なため、これは機能しません。

次に、私はUNIONの両方のテーブルとそれらによってグループ化しようとしました。

CREATEINSERTのコードは次のとおりです。

CREATE TABLE [dbo].[Tbl_Forecast_Test](
[ID] [varchar](100) NULL, 
[CUST_ID] [varchar](40) NULL, 
[MFG_PART_NUMBER] [varchar](40) NULL, 
[SEGMENT] [varchar](40) NULL, 
[WH_NUMBER] [varchar](40) NULL, 
[RTM] [varchar](40) NULL, 
[FORECAST] [int] NULL 
) ON [PRIMARY] 


CREATE TABLE [dbo].[Tbl_Orders_Test](
[ID] [varchar](100) NULL, 
[END_CUST_ID] [varchar](40) NULL, 
[PROD_ID] [varchar](40) NULL, 
[PIPELINE] [varchar](40) NULL, 
[WAREHOUSE] [varchar](40) NULL, 
[RTM_GROUP] [varchar](40) NULL, 
[ORDERS] [int] NULL 
) ON [PRIMARY] 

INSERT INTO [BOSSTest].[dbo].[Tbl_Forecast_Test] 
([ID],[CUST_ID],[MFG_PART_NUMBER],[SEGMENT],[WH_NUMBER],[RTM],[FORECAST]) 
VALUES 
('US8098629','','W0P88EP','Comm','471','Direct','10') 

INSERT INTO [BOSSTest].[dbo].[Tbl_Orders_Test] 
([ID],[END_CUST_ID],[PROD_ID],[PIPELINE],[WAREHOUSE],[RTM_GROUP],[ORDERS]) 
SELECT 'US8098629','W17445','W0P88EP','Ent Group','1','Direct','5' 
UNION ALL 
SELECT 'US8098629','W17445','V9G85EP','Ent Group','460','Direct','12' 
UNION ALL 
SELECT 'US8098629','W17445','V9G85EP','Ent Group','460','Direct','29' 

これは私が取得するクローズです。

SELECT 

[ID] 
,[CUST_ID] 
,[END_CUST_ID] 
,[SKU] 
,[SEGMENT] 
,[PIPELINE] 
,[WH_NUMBER] 
,[WAREHOUSE] 
,[RTM] 
,[RTM_GROUP] 
,SUM ([FORECAST]) AS [FORECAST] 
,SUM([ORDERS]) AS [ORDER_LOAD] 

FROM ( 

    SELECT 

    [ID] AS [ID] 
    ,[CUST_ID] 
    ,'' AS [END_CUST_ID] 
    ,[MFG_PART_NUMBER] AS [SKU] 
    ,[SEGMENT] 
    ,'' AS [PIPELINE] 
    ,[WH_NUMBER] 
    ,'' AS [WAREHOUSE] 
    ,[RTM] 
    ,'' AS [RTM_GROUP] 
    ,SUM ([FORECAST]) AS [FORECAST] 
    ,0 AS [ORDERS] 

    FROM [BOSSTest].[dbo].[Tbl_Forecast_Test] 

    GROUP BY 
    [ID] 
    ,[CUST_ID] 
    ,[MFG_PART_NUMBER] 
    ,[SEGMENT] 
    ,[WH_NUMBER] 
    ,[RTM] 

    UNION ALL 

    SELECT 

    [ID] AS [ID] 
    ,'' AS [CUST_ID] 
    ,[END_CUST_ID] 
    ,[PROD_ID] AS [SKU] 
    ,'' AS [SEGMENT] 
    ,[PIPELINE] 
    ,'' AS [WH_NUMBER] 
    ,[WAREHOUSE] 
    ,'' AS [RTM] 
    ,[RTM_GROUP] 
    ,0 AS [FORECAST] 
    ,SUM([ORDERS]) AS [ORDERS] 

    FROM [BOSSTest].[dbo].[Tbl_Orders_Test] 

    GROUP BY 
    [ID] 
    ,[END_CUST_ID] 
    ,[PROD_ID] 
    ,[PIPELINE] 
    ,[WAREHOUSE] 
    ,[RTM_GROUP] 


) AS TEST 

GROUP BY 
[ID] 
,[CUST_ID] 
,[END_CUST_ID] 
,[SKU] 
,[SEGMENT] 
,[PIPELINE] 
,[WH_NUMBER] 
,[WAREHOUSE] 
,[RTM] 
,[RTM_GROUP] 

これはクエリを実行したときの結果です。

+---------+-------+-----------+-------+-------+---------+---------+---------+------+---------+--------+----------+ 
| ID |CUST_ID|END_CUST_ID|SKU |SEGMENT|PIPELINE |WH_NUMBER|WAREHOUSE| RTM |RTM_GROUP|FORECAST|ORDER_LOAD| 
+---------+-------+-----------+-------+-------+---------+---------+---------+------+---------+--------+----------+ 
|US8098629|  |   |W0P88EP| Comm |   | 471 |   |Direct|   |  10|   0| 
|US8098629|  | W17445 |V9G85EP|  |Ent Group|   |  460|  | Direct|  0|  41| 
|US8098629|  | W17445 |W0P88EP|  |Ent Group|   |  1|  | Direct|  0|   5| 
+---------+-------+-----------+-------+-------+---------+---------+---------+------+---------+--------+----------+ 

しかしこれが私の必要です。私はテーブルに異なるSKUを保持したい。

+---------+-------+-----------+-------+-------+---------+---------+---------+------+---------+--------+----------+ 
| ID |CUST_ID|END_CUST_ID|SKU |SEGMENT|PIPELINE |WH_NUMBER|WAREHOUSE| RTM |RTM_GROUP|FORECAST|ORDER_LOAD| 
+---------+-------+-----------+-------+-------+---------+---------+---------+------+---------+--------+----------+ 
|US8098629|  | W17445 |W0P88EP| Comm |Ent Group| 471 |  1|Direct| Direct|  10|   5| 
|US8098629|  | W17445 |V9G85EP|  |Ent Group|   |  460|  | Direct|  0|  41| 
+---------+-------+-----------+-------+-------+---------+---------+---------+------+---------+--------+----------+ 

1つのレコードでどのようにすることができますIグループID = US8098629SKU = W0P88EP上の任意の提案。事前に

おかげで、 ルイス

+1

MAXを使用して、[ID]、[CUST_ID]、[END_CUST_ID]、[PROD_ID]、[区切り]、[WH_NUMBER]、[WAREHOUSE]、[RTM]、[RTM_GROUP] IDとSKUを除くすべてのフィールドで、()とIDとSKUでグループ化します。しかし、あなたの問題は、あなたが述べているものよりも深刻になる可能性があります。 – scsimon

+0

これについてあなたの考えは何ですか?あなたはなぜそれがより深いと思うのですか? –

+0

オーダー、予測などの集計方法が大規模なデータセットで使用されるため、問題が発生する可能性が高いということです。おそらくそうではないかもしれませんが、そうなるでしょう。非数値型の集計は、null以外の値を取得するために使用されますが、2つの場合は何ですか?これらはあなたが遭遇する可能性のある問題です。 – scsimon

答えて

2

はあなたがIDおよびSKUの両方のための単一の列を必要とするので、あなたが参加し、左を使用することができなかったと述べました。

これを念頭において、左結合を使用することはできます。結合を実行した後、両方のテーブルからすべての列を選択する必要はありません。要件に応じて必要に応じて列を追加または削除します。

+0

これはグループごとに1つのレコードで動作しますが、 'SKU = V9G85EP 'のレコードを除外しているようです。私はテーブルに異なるSKUを保持したい。 –

+1

@ LuisLaraこれは、2番目のSKUがTbl_Forecast_Testに表示されないためです。私は自分の答えを更新しました。単に結合を逆にすると両方のレコードが取り出されます。 NULLを超える空の文字列を使用する場合は、選択したISNULLを使用して修正できます。 –

-1

「END_CUST_ID」でグループ化するのをやめ、代わりに最初をプルするように見えます。

SELECT 
    [ID] 
    ,[CUST_ID] 
    ,Max([END_CUST_ID]) as [END_CUSTID] 
    ,[SKU] 
    ,[SEGMENT] 
    ,[PIPELINE] 
    ,[WH_NUMBER] 
    ,[WAREHOUSE] 
    ,[RTM] 
    ,[RTM_GROUP] 
    ,SUM ([FORECAST]) AS [FORECAST] 
    ,SUM([ORDERS]) AS [ORDER_LOAD] 

    FROM ( 

     SELECT 

     [ID] AS [ID] 
     ,[CUST_ID] 
     ,'' AS [END_CUST_ID] 
     ,[MFG_PART_NUMBER] AS [SKU] 
     ,[SEGMENT] 
     ,'' AS [PIPELINE] 
     ,[WH_NUMBER] 
     ,'' AS [WAREHOUSE] 
     ,[RTM] 
     ,'' AS [RTM_GROUP] 
     ,SUM ([FORECAST]) AS [FORECAST] 
     ,0 AS [ORDERS] 

     FROM [BOSSTest].[dbo].[Tbl_Forecast_Test] 

     GROUP BY 
     [ID] 
     ,[CUST_ID] 
     ,[MFG_PART_NUMBER] 
     ,[SEGMENT] 
     ,[WH_NUMBER] 
     ,[RTM] 

     UNION ALL 

     SELECT 

     [ID] AS [ID] 
     ,'' AS [CUST_ID] 
     ,[END_CUST_ID] 
     ,[PROD_ID] AS [SKU] 
     ,'' AS [SEGMENT] 
     ,[PIPELINE] 
     ,'' AS [WH_NUMBER] 
     ,[WAREHOUSE] 
     ,'' AS [RTM] 
     ,[RTM_GROUP] 
     ,0 AS [FORECAST] 
     ,SUM([ORDERS]) AS [ORDERS] 

     FROM [BOSSTest].[dbo].[Tbl_Orders_Test] 

     GROUP BY 
     [ID] 
     ,[END_CUST_ID] 
     ,[PROD_ID] 
     ,[PIPELINE] 
     ,[WAREHOUSE] 
     ,[RTM_GROUP] 

    ) AS TEST 

    GROUP BY 
    [ID] 
    ,[CUST_ID] 
    ,[SKU] 
    ,[SEGMENT] 
    ,[PIPELINE] 
    ,[WH_NUMBER] 
    ,[WAREHOUSE] 
    ,[RTM] 
    ,[RTM_GROUP] 
あなたが溶液の下に使用できる
+1

FIRSTはSQL Serverの関数ではありません。 –

+0

ありがとう! Max()は正常に動作するはずです。私は私のソリューションを更新します。 – Dave

+0

最後のグループにすべての固有の値を(SEGMENT、PIPELINEなど)含めていれば、3つのレコードを戻すことになります。 –

0

 SELECT [ID],[CUST_ID],max([END_CUST_ID]),[SKU],max([SEGMENT]),max([PIPELINE]),max([WH_NUMBER]),max([WAREHOUSE]),max([RTM]) ,max([RTM_GROUP]),SUM ([FORECAST]) AS [FORECAST],SUM([ORDERS]) AS [ORDER_LOAD] 

FROM ( 
SELECT 

[ID] AS [ID] ,[CUST_ID] ,'' AS [END_CUST_ID] ,[MFG_PART_NUMBER] AS [SKU] ,[SEGMENT] ,'' AS [PIPELINE] ,[WH_NUMBER] ,'' AS [WAREHOUSE] 
,[RTM]  ,'' AS [RTM_GROUP] ,SUM ([FORECAST]) AS [FORECAST] ,0 AS [ORDERS] 
FROM [##Tbl_Forecast_Test] 

GROUP BY  [ID] ,[CUST_ID] ,[MFG_PART_NUMBER] ,[SEGMENT] ,[WH_NUMBER] ,[RTM] 
UNION ALL 

SELECT  [ID] AS [ID] ,'' AS [CUST_ID] ,[END_CUST_ID] ,[PROD_ID] AS [SKU] ,'' AS [SEGMENT] ,[PIPELINE] ,'' AS [WH_NUMBER] ,[WAREHOUSE] 
,'' AS [RTM] ,[RTM_GROUP] ,0 AS [FORECAST] ,SUM([ORDERS]) AS [ORDERS] 
    FROM [##Tbl_Orders_Test] 

    GROUP BY 
[ID] ,[END_CUST_ID] ,[PROD_ID]  ,[PIPELINE] ,[WAREHOUSE] ,[RTM_GROUP]) AS TEST 
    GROUP BY 
    [ID],[CUST_ID],[SKU]  
0

SELECT #Tbl_Orders_Test。[ID]、ISNULL([CUST_ID]、 '')[CUST_ID]、[END_CUST_ID]、PROD_ID] [SKU] [区切り]、[区切り]、[パイプライン]、ISNULL([WH_NUMBER]、 '')[WH_NUMBER]、[倉庫]、ISNULL([RTM]、[')[RTM]、[RTM_GROUP] #[ID] = #Tbl_Orders_Test [ID] = #Tbl_Orders_Test。[ID] = #Tbl_Orders_Test。[ID] = #Tbl_Orders_Test。[ID] = #Tbl_Orders_Test。[ID] = #Tbl_Orders_Test。 AND #Tbl_Forecast_Test [MFG_PART_NUMBER] = #Tbl_Orders_Test。[PROD_ID] GROUP BY #Tbl_Orders_Test。[DES]