2

私は次の表を持っています

ID | Group      | Type         | Product
1    Dairy         Milk           Fresh Milk
2    Dairy         Butter         Butter Cream
3    Beverage      Coke           Coca cola
4    Beverage      Diet           Dew
5    Beverage      Juice          Fresh Juice

次の出力/クエリ結果が必要です。

ID | Group      | Type         | Product
1    Dairy             
1                 Milk           Fresh Milk
2                 Butter         Butter Cream
2    Beverage      
1                Coke            Coca cola
2                Diet            Dew
3                Juice           Fresh Juice

上記のサンプルでは、​​ハード コーディングされたスクリプトで実行できますが、任意の数のグループに対して動的スクリプトを探します。どうすればできるのかわかりません。サンプルクエリはまだありません。少なくとも私にアイデアを与えるアイデア、例が必要です。PIVOT は近い選択肢に見えますが、このケースに完全に適合しているようには見えません。

4

3 に答える 3

2

これが可能な方法です。基本的に、「グループ ヘッダー」と「グループ アイテム」を結合します。難しかったのは、それらを正しく注文することでした。

WITH CTE AS
(
  SELECT ID,[Group],Type,Product,
    ROW_NUMBER() OVER (PARTITION BY [Group] Order By ID)AS RN
  FROM Drink
)
SELECT ID,[Group],Type,Product
FROM(
   SELECT RN AS ID,[Group],[Id]AS OriginalId,'' As Type,'' As Product, 0 AS RN, 'Group' As RowType
   FROM CTE WHERE RN = 1
   UNION ALL
   SELECT RN AS ID,'' AS [Group],[Id]AS OriginalId,Type,Product, RN, 'Item' As RowType
   FROM CTE
)X
ORDER BY  OriginalId ASC
, CASE WHEN RowType='Group' THEN 0 ELSE 1 END ASC
, RN ASC

ここにデモフィドルがあります:http://sqlfiddle.com/#!6/ed6ca/2/0

于 2012-10-19T23:36:45.413 に答える
2

少し単純化されたアプローチ:

With Groups As
    (
    Select Distinct Min(Id) As Id, [Group], '' As [Type], '' As Product
    From dbo.Source
    Group By [Group]
    )
Select Coalesce(Cast(Z.Id As varchar(10)),'') As Id
  , Coalesce(Z.[Group],'') As [Group]
  , Z.[Type], Z.Product
From    (
        Select Id As Sort, Id, [Group], [Type], Product
        From Groups
        Union All
        Select G.Id, Null, Null, S.[Type], S.Product
        From dbo.Source As S
            Join Groups As G
                On G.[Group] = S.[Group]
        ) As Z
Order By Sort

Coalesceの使用は純粋に審美的な理由によるものであることに注意してください。これらの場合、単純に null を返すことができます。

SQL フィドル

于 2012-10-19T23:53:05.387 に答える
0

ROW_NUMBER を使用したアプローチ:

IF OBJECT_ID('dbo.grouprows') IS NOT NULL DROP TABLE dbo.grouprows;

CREATE TABLE dbo.grouprows(
ID INT,
 Grp NVARCHAR(MAX),
 Type NVARCHAR(MAX),
 Product NVARCHAR(MAX)
 );
 INSERT INTO dbo.grouprows VALUES
(1,'Dairy','Milk','Fresh Milk'),
(2,'Dairy','Butter','Butter Cream'),
(3,'Beverage','Coke','Coca cola'),
(4,'Beverage','Diet','Dew'),
(5,'Beverage','Juice','Fresh Juice');

SELECT 
CASE WHEN gg = 0 THEN dr1 END GrpId,
CASE WHEN gg = 1 THEN rn1 END TypeId,
ISNULL(Grp,'')Grp,
CASE WHEN gg = 1 THEN Type ELSE '' END Type,
CASE WHEN gg = 1 THEN Product ELSE '' END Product
FROM(
SELECT *,
DENSE_RANK()OVER(ORDER BY Grp DESC) dr1
FROM( 
SELECT *,
ROW_NUMBER()OVER(PARTITION BY Grp ORDER BY type,gg) rn1,
ROW_NUMBER()OVER(ORDER BY type,gg) rn0
FROM(
SELECT  Grp,Type,Product, GROUPING(Grp) gg, GROUPING(type) tg FROM dbo.grouprows
GROUP BY Product, Type, Grp
WITH ROLLUP
)X1
WHERE tg = 0
)X2
WHERE gg=1 OR rn1 = 1
)X3
ORDER BY rn0
于 2012-10-20T00:01:32.113 に答える