1

こんな感じのテーブルがあります。

ここに画像の説明を入力

注文ごとに 1 つのレコードのみを表示する最終結果が必要です (基本的にサブオーダーを結合します)。別個の下位注文の収益のみを合計します (注文 0935744 の場合、575.04 + 31.68 を合計します)。注文には最大 2 人の従業員を含めることができます

最終結果は次のようになります。

order      totalrevenue  employee1 employee2 
0813700     258.57        CREW      NULL      
0935744     606.72        95liv     95nat  

row_number を使用していくつかの結合を試みましたが、うまくいきませんでした。

サンプルコード

SELECT N'0813700' AS [OrderNum], N'1077980' AS [SubOrder], N'CREW' AS [employeeid], N'258.57' AS [revenue] UNION ALL
SELECT N'0935744' AS [OrderNum], N'1257060' AS [SubOrder], N'95LIV' AS [employeeid], N'575.04' AS [revenue] UNION ALL
SELECT N'0935744' AS [OrderNum], N'1342944' AS [SubOrder], N'95LIV' AS [employeeid], N'31.68' AS [revenue] UNION ALL
SELECT N'0935744' AS [OrderNum], N'1257060' AS [SubOrder], N'95NAT' AS [employeeid], N'575.04' AS [revenue] UNION ALL
SELECT N'0935744' AS [OrderNum], N'1342944' AS [SubOrder], N'95NAT' AS [employeeid], N'31.68' AS [revenue]
4

4 に答える 4

0

これにより、探している結果が得られるはずです。

create table #temp
(
    ordernum int,
    suborder int,
    employeeid varchar(50),
    revenue money
)

insert into #temp values(0813700, 1077980, 'CREW', 258.57)
insert into #temp values(0935744, 1257060, '95LIV', 575.04)
insert into #temp values(0935744, 1342944, '95LIV', 31.68)
insert into #temp values(0935744, 1257060, '95NAT', 575.04)
insert into #temp values(0935744, 1342944, '95NAT', 31.68)

select ordernum
    , sum(revenueperorder) as total
    , employee1
    , case when employee1 = employee2 then null else employee2 end as employee2
from 
(
    select ordernum
        , revenue as revenueperorder
        , min(employeeid) as employee1
        , max(employeeid) as employee2
    from #temp
    group by ordernum, revenue
) x
group by ordernum, employee1, employee2

drop table #temp

Results:

813700  258.57  CREW    NULL
935744  606.72  95LIV   95NAT
于 2012-04-30T20:00:03.033 に答える
0

これまでの回答では、ピボットエンティティとして定義されたemployee1と2を使用したハードコードされたピボットが必要です。データが動的である場合、従業員の数はさまざまであると思います(したがって、列の数もさまざまです)。 ?もしそうなら、私はあなたが次のようなハイブリッド動的SQL/ピボットの例を採用することをお勧めします:

ピボットテーブルと連結列

またはこれ:

SQL2005のPIVOT

于 2012-04-30T21:59:49.647 に答える
0
DECLARE @SubOrder TABLE
(
    OrderNum    INT NOT NULL,
    SubOrder    INT NOT NULL,
    EmployeeID  NVARCHAR(50) NOT NULL,
    Revenue     NUMERIC(10, 2) NOT NULL
);

INSERT  @SubOrder (OrderNum, SubOrder, EmployeeID, Revenue)
SELECT N'0813700' AS [OrderNum], N'1077980' AS [SubOrder], N'CREW' AS [employeeid], N'258.57' AS [revenue] UNION ALL
SELECT N'0935744' AS [OrderNum], N'1257060' AS [SubOrder], N'95LIV' AS [employeeid], N'575.04' AS [revenue] UNION ALL
SELECT N'0935744' AS [OrderNum], N'1342944' AS [SubOrder], N'95LIV' AS [employeeid], N'31.68' AS [revenue] UNION ALL
SELECT N'0935744' AS [OrderNum], N'1257060' AS [SubOrder], N'95NAT' AS [employeeid], N'575.04' AS [revenue] UNION ALL
SELECT N'0935744' AS [OrderNum], N'1342944' AS [SubOrder], N'95NAT' AS [employeeid], N'31.68' AS [revenue];

SELECT  pvt.OrderNum,
        pvt.TotalRevenue,
        pvt.[1] AS Emp1,
        pvt.[2] AS Emp2
FROM
(
        SELECT  dt.OrderNum,
                dt.EmployeeID,
                DENSE_RANK()    OVER(PARTITION BY dt.OrderNum ORDER BY dt.EmployeeID) AS Rnk,
                SUM(dt.Revenue) OVER(PARTITION BY dt.OrderNum) AS TotalRevenue
        FROM
        (
                SELECT  so.OrderNum,
                        so.EmployeeID,
                        ROW_NUMBER() OVER(PARTITION BY so.OrderNum, so.SubOrder ORDER BY @@SPID) AS RowNum,
                        so.Revenue
                FROM    @SubOrder so
        ) dt
        WHERE   dt.RowNum = 1
) src
PIVOT   ( MAX(src.EmployeeID) FOR src.Rnk IN ([1], [2]) ) pvt

結果:

OrderNum TotalRevenue Emp1   Emp2
-------- ------------ ------ -----
813700   258.57       CREW   NULL
935744   606.72       95LIV  95NAT

中間結果(...) src:

OrderNum EmployeeID Rnk TotalRevenue
-------- ---------- --- ------------
813700   CREW       1   258.57
935744   95LIV      1   606.72
935744   95NAT      2   606.72

中間結果(...) dt:

OrderNum EmployeeID RowNum Revenue
-------- ---------- ------ -------
813700   CREW       1      258.57
935744   95LIV      1      575.04
935744   95NAT      2      575.04
935744   95NAT      1      31.68
935744   95LIV      2      31.68
于 2012-04-30T21:50:29.420 に答える
0

これはどう?(OPからのコメント後に修正)

仮定:

  1. 注文ごとに 2 人以下の従業員。
  2. サブオーダーごとに 1 人の従業員 (例のように)
  3. サブオーダーの収益は、サブオーダーの行で一貫して複製されます (例)

コード例

select order, sum(revenue) as totalrevenue, max(employee1) as employee1,
case
    when max(employee1) = max(employee2) then null
    else max(employee2)
end as employee2
from (
    select order, suborder, max(revenue) as revenue, max(employeeid)
    from orders
    group by order, suborder
) SubOrderTotal
group by order

一般に、2 人の従業員への厳格な変換や、サブオーダーの収益の複製はお勧めしません。このような厳密な仮定を行うと、現実世界のデータを扱うときにバグが発生することがよくあります。しかし、私はあなたのデータを知りません。

于 2012-04-30T19:07:25.570 に答える