1

どのユーザーがチケットを完了したかを示す次のコードがあり、これには各ユーザーとチケットをクローズした日付がリストされます。すなわち

Paul
Matt
Matt
Bob
Matt
Paul
Matt
Matt

現時点では、各ユーザーを手動で数えて、その日の合計を確認しています。

編集:行ではなく列として出力を変更しました:

私がやろうとしてきたことは、SQL Serverにこれを実行させることです。つまり、最終結果は次のようになります。

Paul  |  2
Matt  |  5
Bob   |  1

私が現在使用している私のコードは、上記のようなものを出力できるように、誰かがこれを変更するのを手伝ってくれると助かりますか?

DECLARE @StartDate DateTime;
DECLARE @EndDate DateTime;

-- Date format: YYYY-MM-DD
SET @StartDate = '2013-11-06 00:00:00'
SET @EndDate = GETDATE()  -- Today


SELECT  (select Username from Membership where UserId =  Ticket.CompletedBy) as TicketStatusChangedBy

FROM         Ticket INNER JOIN
                      TicketStatus ON Ticket.TicketStatusID = TicketStatus.TicketStatusID INNER JOIN
                      Membership ON Ticket.CheckedInBy = Membership.UserId
WHERE TicketStatus.TicketStatusName = 'Completed' and Ticket.ClosedDate >= @StartDate --(GETDATE() - 1)
and Ticket.ClosedDate <= @EndDate --(GETDATE()-0)
ORDER BY Ticket.CompletedBy ASC, Ticket.ClosedDate ASC

ご協力いただき、ありがとうございました。

4

3 に答える 3

0
CREATE TABLE  SomeTable 
(Name NVARCHAR(20))
GO

INSERT INTO SomeTable 
VALUES ('Mark'), ('Mark'),('Mark'),('SAM'),('SAM'),('Josh')
GO

;WITH CTE
AS
(
    SELECT NAME, COUNT(*) AS Total FROM SomeTable
    GROUP BY Name
)

SELECT * 
FROM CTE
        PIVOT (
                MAX(Total)
                FOR NAME 
                IN ([Mark], [SAM], [Josh])      
               )l

結果セット

Mark SAM  Josh
3    2    1

明らかに、テーブルに多くの値がある場合は、Dynamic Sql を使用する必要があります。最初に、すべての個別の値/名前のカンマ区切りリストを作成し、上記のクエリの「IN」句で名前のリストを動的 Sql に渡します。 .
動的 SQL の使用

DECLARE @NameList NVARCHAR(MAX) = ''
DECLARE @Sql NVARCHAR(MAX)

SELECT @NameList =   @NameList + ',['  + Name + ']' 
                    FROM (SELECT DISTINCT NAME FROM SomeTable)t
SET @NameList =    STUFF(@NameList, 1, 1, '')
PRINT @NameList      --<---- for checking purpose to see if list is as expected

SET @Sql = ';WITH CTE
AS
(
    SELECT NAME, COUNT(*) AS Total FROM SomeTable
    GROUP BY Name
)

SELECT * 
FROM CTE
        PIVOT (
                MAX(Total)
                FOR NAME 
                IN ('+ @NameList + ')       
               )l'
EXECUTE sp_executesql @Sql

結果セット

Mark SAM  Josh
3    2    1
于 2013-11-07T11:52:45.023 に答える
0
Declare @t table(names varchar(100))

DECLARE @StartDate DateTime;
DECLARE @EndDate DateTime;

-- Date format: YYYY-MM-DD
SET @StartDate = '2013-11-06 00:00:00'
SET @EndDate = GETDATE()  -- Today

insert into @t(names)
SELECT  (select Username from Membership where UserId =  Ticket.CompletedBy) as TicketStatusChangedBy

FROM         
Ticket INNER JOIN TicketStatus ON Ticket.TicketStatusID = TicketStatus.TicketStatusID INNER JOIN
         Membership ON Ticket.CheckedInBy = Membership.UserId
WHERE TicketStatus.TicketStatusName = 'Completed' and Ticket.ClosedDate >= @StartDate 
--(GETDATE() - 1)
and Ticket.ClosedDate <= @EndDate --(GETDATE()-0)
ORDER BY Ticket.CompletedBy ASC, Ticket.ClosedDate ASC

Select 
sum(case when names='Paul' then 1 else 0 end) as Paul,
sum(case when names='Matt' then 1 else 0 end) as Matt,
.
.
.
from @t
于 2013-11-07T11:53:40.920 に答える