0
"Project nr"    "Task"                "Task deadline"  "Task Type Production"

456             packed                1 april 2013      Packed
456             Leave production      3 april 2013      Leave Production
456             Flight date           9 april 2013      Flight Date
123             packed                1 april 2013      Packed
123             Leave production      6 april 2013      Leave Production
123             Flight date           9 april 2013      Flight Date
789             packed                1 april 2013      Packed
789             Leave production      9 april 2013      Leave Production
789             Flight date           9 april 2013      Flight Date

上記のようなリストが必要です 「生産終了」の日付でソートしたい プロジェクト番号は、上記のリストのように 3 つのグループにとどまる必要があります。

私はすでにこのSQLを持っています。リストは機能していますが、並べ替えは機能していません。エラー: マルチパート識別子 "タスク.[タスクの期限]" をバインドできませんでした。すでに提案がありましたが、まだエラーがあります。どうすればソートされますか?

これは私が得るリストです:

Project Nr     Task             TaskDate
0053           Packed           2013-02-05 17:00:00.000
0053           Leave Production 2011-04-26 17:00:00.000
0053           Flight Date      2011-04-22 17:00:00.000
0071           Leave Production 2011-06-24 17:00:00.000
0081           Leave Production 2012-03-09 17:00:00.000
0081-01        Leave Production 2012-03-09 17:00:00.000 

これはSQLです:

    SELECT  [Project nr], Task, TaskDate
        FROM    (
        SELECT   MSP_EpmProject_UserView.[Project nr]
                ,MAX(CASE   WHEN [Task Type Production] = 'Packed' 
                            THEN [Task deadline] 
                        END) AS Packed
                ,MAX(CASE   WHEN [Task Type Production] = 'Leave Production' 
                            THEN [Task deadline]
                        END) AS [Leave Production]
                ,MAX(CASE   WHEN [Task Type Production] = 'Flight Date' 
                           THEN [Task deadline]
                        END) AS [Flight Date]
       FROM    MSP_EpmProject_UserView 
               LEFT JOIN MSP_EpmTask_UserView 
                    ON MSP_EpmProject_UserView.ProjectUID = MSP_EpmTask_UserView.ProjectUID 
                LEFT JOIN MSP_EpmAssignment_UserView 
                    ON MSP_EpmTask_UserView.TaskUID = MSP_EpmAssignment_UserView.TaskUID 
               LEFT JOIN MSP_EpmResource_UserView 
               ON MSP_EpmAssignment_UserView.ResourceUID = MSP_EpmResource_UserView.ResourceUID 
    WHERE (MSP_EpmTask_UserView.TaskIsProjectSummary = 0) 
    GROUP BY MSP_EpmProject_UserView.[Project nr]
    )     data
        UNPIVOT
    (
      TaskDate
      for [Task] in ([Pack],[Leave Production],[Flight Date])
    ) piv
  SELECT  [Project nr], Task, TaskDate
  FROM    (
  SELECT   MSP_EpmProject_UserView.[Project nr]
        ,MAX(CASE   WHEN [Task Type Production] = 'Packed' 
                    THEN [Task deadline] 
                END) AS Packed
        ,MAX(CASE   WHEN [Task Type Production] = 'Leave Production' 
                    THEN [Task deadline]
                END) AS [Leave Production]
        ,MAX(CASE   WHEN [Task Type Production] = 'Flight Date' 
                    THEN [Task deadline]
                END) AS [Flight Date]
   FROM    MSP_EpmProject_UserView 
        LEFT JOIN MSP_EpmTask_UserView 
            ON MSP_EpmProject_UserView.ProjectUID = MSP_EpmTask_UserView.ProjectUID 
        LEFT JOIN MSP_EpmAssignment_UserView 
            ON MSP_EpmTask_UserView.TaskUID = MSP_EpmAssignment_UserView.TaskUID 
        LEFT JOIN MSP_EpmResource_UserView 
            ON MSP_EpmAssignment_UserView.ResourceUID = MSP_EpmResource_UserView.ResourceUID 
   WHERE (MSP_EpmTask_UserView.TaskIsProjectSummary = 0) 
  GROUP BY MSP_EpmProject_UserView.[Project nr]
  ) data
  UNPIVOT
  (
     TaskDate
    for [Task] in ([Pack],[Leave Production],[Flight Date])
   ) piv

This line should do the sort, but i get an error
    ORDER BY    data.[Task deadline]

Msg 4104, Level 16, State 1, Line 62
The multi-part identifier "data.[Leave Production]" could not be bound.
The problem lies in the fact that I need a pivot list that is sorted on the second line of the  group
      0053           Packed           2013-02-05 17:00:00.000
 -->> 0053           Leave Production 2011-04-26 17:00:00.000
      0053           Flight Date      2011-04-22 17:00:00.000

以前にこの質問を送信しましたが、残念ながら回答が機能しません。おそらく、別のセットアップが必要です。何か案は?

4

2 に答える 2

0

データ サブクエリには、プロジェクト番号とフライト日付の 2 つのフィールドがあるようです。データ内の何かで並べ替えたい場合は、これらの 2 つの選択肢しかありません。

于 2013-02-24T15:47:14.300 に答える
0

だから私はあなたの要件を誤解しているかもしれませんが、これが私が思いついたものです:

with M([Project Nr], [Task], [taskdate]) as (
    select '0053', 'Packed', '2013-02-05 17:00:00.000' union
    select '0053 ', 'Leave Production', '2011-04-26 17:00:00.000' union
    select '0053', 'Flight Date', '2011-04-22 17:00:00.000' union
    select '0071', 'Leave Production', '2011-06-24 17:00:00.000' union
    select '0071', 'Packed', '2011-03-09 17:00:00.000' union
    select '0071', 'Flight Date', '2011-07-09 17:00:00.000' union
    select '0081', 'Leave Production', '2013-06-24 17:00:00.000' union
    select '0081', 'Packed', '2011-03-09 17:00:00.000' union
    select '0081', 'Flight Date', '2011-07-09 17:00:00.000' union
    select '0091', 'Leave Production', '2006-06-24 17:00:00.000' union
    select '0091', 'Packed', '2011-03-09 17:00:00.000' union
    select '0091', 'Flight Date', '2011-07-09 17:00:00.000' 
)

select 
    * 
from 
    M AllData
    inner join (
        select 
            ROW_NUMBER() OVER (Order by TaskDate) as ProductionOrder, 
            [Project Nr] 
        from 
            M
        where
            task = 'Leave Production'
    )
ProductionOrder
    on ProductionOrder.[Project Nr] = AllData.[Project Nr]
Order by
    ProductionOrder

基本的には、すべての Leave Production タスクを取得し、それらにウィンドウ化された行番号を順番に割り当て、それをプロジェクト番号でプロジェクト リストに結合し、そのウィンドウ化された番号で完全なデータ セットを並べ替えます。

あなたの問題の 1 つは、複数列のピボットを実行して最大の締め切り日を取得してから、ピボットを解除しようとしていることです。したがって、最後にすべての MAX(CASE .. ) ロジックの目的を無効にしています。もう1つの問題は、たとえば、データクエリに次の結果セットがあることです

プロジェクト番号、梱包済、休暇生産、フライト日

しかし、Task Date と Task を使用してピボットを解除しようとしており、それらがソース クエリに存在しません。

于 2013-02-24T15:50:57.350 に答える