【问题标题】:Pivot Case Statements into Column headers将案例语句透视到列标题中
【发布时间】:2016-08-30 14:45:36
【问题描述】:

我不是 SQL 专家。我有以下查询,我想做的是将 Status 作为单独的列移动并计算不同的 actionid。

查询:

SELECT
CONVERT (Date,[ActionTime],103) AS DATE,
COUNT(DISTINCT ActionID) AS Actions,
VehicleID AS VehicleID,
DriverID AS DriverID,
     CASE 
     WHEN ActionTypeID = 7 THEN 'Not Suitable'
     WHEN ActionTypeID = 8 THEN 'Job Acknowledged'
     WHEN ActionTypeID = 9 THEN 'Job Accepted'
     WHEN ActionTypeID = 10 THEN 'Job Rejected'
     WHEN ActionTypeID = 12 THEN 'Job Recall'
     WHEN ActionTypeID = 66 THEN 'Child Fleet Logon'
     WHEN ActionTypeID = 67 THEN 'Child Fleet Logoff'
     ELSE '' END AS Status

FROM [TaxiHistory].[dbo].[Actions]
WHERE actiontime between '2016-02-01 00:00:00' AND '2016-02-02 23:59:59'
  AND ActiontypeID IN (7,8,9,10,12,66,67)

  GROUP BY CONVERT (Date,[ActionTime],103),
CASE 
     WHEN ActionTypeID = 7 THEN 'Not Suitable'
     WHEN ActionTypeID = 8 THEN 'Job Acknowledged'
     WHEN ActionTypeID = 9 THEN 'Job Accepted'
     WHEN ActionTypeID = 10 THEN 'Job Rejected'
     WHEN ActionTypeID = 12 THEN 'Job Recall'
     WHEN ActionTypeID = 66 THEN 'Child Fleet Logon'
     WHEN ActionTypeID = 67 THEN 'Child Fleet Logoff'
     ELSE ''  END,
VehicleID,
DriverID

【问题讨论】:

  • 请发布示例数据和预期结果。
  • 那么您想要计算与特定 ActionTypeID 关联的所有不同 ActionID 的数量吗?您将获得由特定驾驶员操作的车辆,该车辆具有对该车辆执行的操作数的计数,该车辆具有整个设置的状态,我猜,索赔或归档。所以你只需要 ActionTypeID |完成的不同操作总数?
  • 我尝试过这个 Felix,一直在努力寻找如何上传文件,所以希望一张图片就足够了,它应该可以使用原始帖子中的链接。
  • 列标题将是日期、vehilceID、VehicleID、不适合、已确认的工作等。行将读取,在 2016 年 2 月 2 日 driverid 123 中的 vehicleid 456 中有 4 不适合,6 已确认, 2 工作接受等。我希望这是有道理的

标签: sql sql-server tsql pivot case


【解决方案1】:

我认为这就是你想要做的。

SELECT  CONVERT (DATE,[ActionTime],103) AS [Date],
        VehicleID AS VehicleID,
        DriverID AS DriverID,
        COUNT(CASE WHEN ActionTypeID = 7 THEN 1 END)  AS [Not Suitable],
        COUNT(CASE WHEN ActionTypeID = 8 THEN 1 END)  AS [Job Acknowledged],
        COUNT(CASE WHEN ActionTypeID = 9 THEN 1 END)  AS [Job Accepted],
        COUNT(CASE WHEN ActionTypeID = 10 THEN 1 END) AS [Job Rejected],
        COUNT(CASE WHEN ActionTypeID = 12 THEN 1 END) AS [Job Recall],
        COUNT(CASE WHEN ActionTypeID = 66 THEN 1 END) AS [Child Fleet Logon],
        COUNT(CASE WHEN ActionTypeID = 67 THEN 1 END) AS [Child Fleet Logoff]
FROM    [TaxiHistory].[dbo].[Actions]
WHERE   actiontime BETWEEN '2016-02-01 00:00:00'
                   AND     '2016-02-02 23:59:59'
        AND ActiontypeID IN (7,8,9,10,12,66,67)
GROUP BY CONVERT (DATE,[ActionTime],103),
        VehicleID,
        DriverID

【讨论】:

  • 谢谢 JamieD77
【解决方案2】:
select
    CONVERT (Date,[ActionTime],103) AS DATE,
    COUNT(DISTINCT ActionID) AS Actions,
    VehicleID AS VehicleID,
    DriverID AS DriverID,
    [7] 'Not Suitable',
    [8] 'Job Acknowleged',
    [9] 'Job Accepted',
    [10] 'Job Rejected',
    [12] 'Job Recall',
    [66] 'Child Freet Logon',
    [67] 'Child Fleet Logoff'   
(
    select ActionTime, VehicleId, DriverId, ActionTypeId, count(*) as TotalType
    FROM [TaxiHistory].[dbo].[Actions]
    WHERE actiontime between '2016-02-01 00:00:00' AND '2016-02-02 23:59:59'
      AND ActiontypeID IN (7,8,9,10,12,66,67)
    group by ActionTime, VehicleId, DriverId, ActionTypeId
pivot(sum(TotalType) for ActionTypeId in ([7],[8],[9],[10],[12], [66], [67])) 
) p

内部查询是基本查询,它获取每个ActionTime、Vehicle、Deiver 和ActionType 的Action 数量。最后的 PIVOT 基本上说明了列出的每个 ActionTypeId,总结 TotalType 并在结果集中以 ActionTypeId 值的名称放入一列。这个结果集(查询中的 p)然后是外部选择的输入,外部选择采用列并为其添加各种名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    相关资源
    最近更新 更多