2

質問があります

declare @Leavetype varchar (Max)    
select @Leavetype =(select LeaveName from LeaveType)     

SELECT *
 FROM 
 ( SELECT e.EmpID,
 e.EmpName , 
 s.LeaveName, 
 case when l.Approval = 'Approved'
 then l.TotalDays 
 else
 0
 end  AS Total
  from  EmpInfo e
  full JOIN  ViewLeave l   ON e.EmpID = l.EmpID
  LEFT  JOIN LeaveType  s  ON s.LeaveID = l.LeaveID    

 Where
      l.year = '2013'              

 GROUP BY s.LeaveName,e.EmpID, e.EmpName ,l.Approval,l.TotalDays
 )ps
 pivot
 (
 sum(Total)
 for LeaveName In ([@LeaveType])

 )as pvt         

Leave タイプテーブルから動的な値を取得したいLeavetype

LeaveType表は次のとおりです

ID   Leave type
1    SickLeave
2    Casual Leave

LeaveTypeテーブルの値は異なる場合があり、次のようなデータを表示する必要があります

EmpId    EmpName    SickLeave     Casual Leave 

101      ramesh       1               0

Leavetype列の数はテーブル内の行の数に依存します

誰かがアイデアを持っているなら、私を助けてください

この現在のクエリはエラーを示しています

サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。

ありがとう

4

1 に答える 1

0

あなたはアイデアに近いですが、動的SQLを使用してテーブルを動的にピボットする必要があります。あなたが持っているエラーはselect @Leavetype =(select LeaveName from LeaveType)、変数に代入するためにサブクエリによって返される値が1つしかないためです。

あなたがする必要があるのは、大まかに次のようなもので、コンマで区切られた値の文字列 (列) を使用してピボット クエリを作成します。

-- get a comma delimited string of the columns
DECLARE @leaveType NVARCHAR(1000)
SELECT @leaveType = STUFF(
                      (SELECT DISTINCT TOP 100 PERCENT '],[' + LeaveName
                       FROM LeaveType AS t
                       FOR XML PATH('') 
                      ), 1, 2, ''
                    ) + ']'

-- create the sql script to be executed
DECLARE @sql NVARCHAR(3000) = N'
    WITH data AS
    (
        SELECT 
            e.EmpID,
            e.EmpName , 
            s.LeaveName, 
            Total = CASE l.Approval 
                        WHEN ''Approved'' THEN l.TotalDays 
                        ELSE 0 
                    END
        FROM EmpInfo e
        FULL JOIN ViewLeave l ON e.EmpID = l.EmpID
        LEFT JOIN LeaveType s ON s.LeaveID = l.LeaveID
        GROUP BY s.LeaveName, e.EmpID, e.EmpName, l.Approval, l.TotalDays
    )

    SELECT *
    FROM data
    PIVOT
    (
        SUM(Total)
        FOR LeaveName IN (' + @leaveType + ')
    ) piv
' 

PRINT @sql
EXEC sp_executesql @sql

PIVOT詳細については、こちらのブログ記事をご覧ください

于 2013-08-03T08:16:49.487 に答える