【问题标题】:SQL Pivot - adding another columnSQL Pivot - 添加另一列
【发布时间】:2014-06-27 11:09:34
【问题描述】:

我认为我需要创建一个数据透视表。我可以在没有劳动时间列的情况下做到这一点,但是当我尝试使用劳动时间列创建它时它不起作用。

你能告诉我如何得到我要求的结果吗?

还有多个“Par”值,下面没有显示。

这是我的桌子:

WorkDate    Par QTY laborhrs
03/14/14    CR  100 0.67
03/25/14    ET  100 0.73
03/05/14    CR  50  0.37
03/13/14    ER  50  0.72
03/04/14    YD  400 1.68
03/25/14    CR  200 0.8
03/25/14    CR  300 1.5

这是我想要的:

WorkDate    CR  CRHours ER  ERHours ET  ETHours YD  YDHours
03/04/14    0   0       0   0       0   0       400 1.68
03/05/14    50  0.37    0   0       0   0       0   0
03/13/14    0   0       50  0.72    0   0       0   0
03/14/14    100 0.67    0   0       0   0       0   0
03/25/14    500 2.3     0   0       100 0.73    0   0

新的“小时”列来自每个“标准”的劳动力列

【问题讨论】:

    标签: sql-server tsql sql-server-2008-r2 pivot


    【解决方案1】:

    有多种方法 您可以创建两个 PIVOT 子查询并加入它们,但我更喜欢这种方式

    SELECT
    t.WorkDate
    ,SUM(CASE WHEN t.Par='CR' THEN t.Qty ELSE 0 END) AS CR
    ,SUM(CASE WHEN t.Par='CR' THEN t.laborhrs ELSE 0 END) AS CRHours
    
    ,SUM(CASE WHEN t.Par='ER' THEN t.Qty ELSE 0 END) AS ER
    ,SUM(CASE WHEN t.Par='ER' THEN t.laborhrs ELSE 0 END) AS ERHours
    
    ,SUM(CASE WHEN t.Par='ET' THEN t.Qty ELSE 0 END) AS ET
    ,SUM(CASE WHEN t.Par='ET' THEN t.laborhrs ELSE 0 END) AS ETHours
    
    ,SUM(CASE WHEN t.Par='YD' THEN t.Qty ELSE 0 END) AS YD
    ,SUM(CASE WHEN t.Par='YD' THEN t.laborhrs ELSE 0 END) AS YDHours
    
    GROUP BY t.WorkDate
    FROM [tablename] t
    

    这是我发现的解决这些问题的最快方法,因为它只需要遍历表一次。

    【讨论】:

    • 汤姆打败了我。凯文,我猜基于你说的“还有多个“Par”值这一事实,你暗示你不想为每个 Par 类型硬编码列。但是,我不认为 Pivot 可以完成您正在寻找的内容,据我所知,这让您要么对字段进行硬编码,要么编写动态 SQL 脚本。祝你好运!
    【解决方案2】:

    另一种选择是相关查询:

    select workdate,
    (select sum(qty) from labour a where a.workdate=b.workdate and a.par='CR') CR,
    (select sum(laborhrs) from labour a where a.workdate=b.workdate and a.par='CR') CRhours,
    (select sum(qty) from labour a where a.workdate=b.workdate and a.par='ER') ER,
    (select sum(laborhrs) from labour a where a.workdate=b.workdate and a.par='ER') ERhours,
    (select sum(qty) from labour a where a.workdate=b.workdate and a.par='ET') ET,
    (select sum(laborhrs) from labour a where a.workdate=b.workdate and a.par='ET') EThours,
    (select sum(qty) from labour a where a.workdate=b.workdate and a.par='YD') YD,
    (select sum(laborhrs) from labour a where a.workdate=b.workdate and a.par='YD') YDhours
    from yourtable b
    group by workdate
    

    【讨论】:

    • 尽可能避免相关子查询。仔细想想……一旦你得到了几天的数据,这将是一个问题,因为这 8 个相关查询中的每一个都必须针对每个工作日期值进行评估。因此,一个月后,当您有 20 个工作日时,将评估 160 个单独的查询,以获得您的 20 个结果行。这个数字实际上会更大,因为有超过 4 个 [par] 值并且它会继续增长
    • 不过,没有理由拒绝它。这是解决问题的有效方法;除非交易量非常大,否则执行时间会很短。
    猜你喜欢
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2012-09-23
    • 2016-06-08
    • 1970-01-01
    • 2017-03-02
    • 2012-01-13
    相关资源
    最近更新 更多