Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL server中将行合并到列_Sql Server - Fatal编程技术网

Sql server 在SQL server中将行合并到列

Sql server 在SQL server中将行合并到列,sql-server,Sql Server,这是“tbltask”表 现在我需要得到每个人的总数:发货、挑选、打包 name ship Total pick Total pack Total john 2 1 3 kevin 1 2 0 steve 2 2 2 我可以使用三个语句来获得结果: select [Ship_Operator] ,count(*) as task_total from

这是“tbltask”表

现在我需要得到每个人的总数:发货、挑选、打包

name    ship Total  pick Total  pack Total
john    2           1           3
kevin   1           2           0
steve   2           2           2
我可以使用三个语句来获得结果:

select [Ship_Operator] ,count(*) as task_total  from tbltask 
where [Ship_Operator] in ('john','kevin','steve')
group by [Ship_Operator]

select [Pick_Operator] ,count(*) as task_total from tbltask 
where [Pick_Operator] in ('john','kevin','steve')
group by [Pick_Operator]

select [Pack_Operator] ,count(*) as task_total from tbltask 
where [Pack_Operator] in ('john','kevin','steve')
group by [Pack_Operator]
是否可以使用一条SQL语句?
谢谢你的帮助

使用
UNION
组合所有名称并添加一个新列以仅标识不同的值

查询

SELECT t.[Name],
SUM(CASE t.[Col1] WHEN 'Ship' THEN 1 ELSE 0 END) AS [Ship Total],
SUM(CASE t.[Col1] WHEN 'Pick' THEN 1 ELSE 0 END) AS [Pick Total],
SUM(CASE t.[Col1] WHEN 'Pack' THEN 1 ELSE 0 END) AS [Pack Total]
FROM(
    SELECT 'Ship' AS [col1], [Ship_operator] as [Name]
    FROM [tbltask]
    UNION ALL
    SELECT 'Pick', [Pick_operator]
    FROM [tbltask]
    UNION ALL
    SELECT 'Pack' AS [col1], [Pack_operator]
    FROM [tbltask]
)t
GROUP BY t.[Name];

如果你想得到这三个名字的结果。然后在子查询中添加一个
WHERE
条件。

使用
UNION
组合所有名称,并添加一个新列以仅标识不同的值

查询

SELECT t.[Name],
SUM(CASE t.[Col1] WHEN 'Ship' THEN 1 ELSE 0 END) AS [Ship Total],
SUM(CASE t.[Col1] WHEN 'Pick' THEN 1 ELSE 0 END) AS [Pick Total],
SUM(CASE t.[Col1] WHEN 'Pack' THEN 1 ELSE 0 END) AS [Pack Total]
FROM(
    SELECT 'Ship' AS [col1], [Ship_operator] as [Name]
    FROM [tbltask]
    UNION ALL
    SELECT 'Pick', [Pick_operator]
    FROM [tbltask]
    UNION ALL
    SELECT 'Pack' AS [col1], [Pack_operator]
    FROM [tbltask]
)t
GROUP BY t.[Name];

如果你想得到这三个名字的结果。然后在子查询中添加
WHERE
条件。

unpivot
pivot
返回:

with t(task,Ship_Operator,Pick_Operator,Pack_Operator) as (
select '1','john','kevin','steve'  union all
select '2','kevin','kevin','john'  union all
select '3','steve','john','john'   union all
select '4','steve','steve','steve' union all
select '5','john','steve','john')
-------Test data set up ends here------------

select 
    name, Ship_Operator ship_total, Pick_Operator pick_total, Pack_Operator pack_total
from t unpivot (
    name for operation in (Ship_Operator, Pick_operator, Pack_Operator)
) as x pivot (
    count(task) for operation in ([Ship_Operator],[Pick_Operator],[Pack_Operator])
) as x;
产生:

另一种方法是仅使用
UNPIVOT
,然后有条件地聚合:

with t(task,Ship_Operator,Pick_Operator,Pack_Operator) as (
select '1','john','kevin','steve'  union all
select '2','kevin','kevin','john'  union all
select '3','steve','john','john'   union all
select '4','steve','steve','steve' union all
select '5','john','steve','john')
-------Test data set up ends here------------

select 
    name,
    count(case when operation = 'Ship_Operator' then 1 end) ship,
    count(case when operation = 'Pick_Operator' then 1 end) pick,
    count(case when operation = 'Pack_Operator' then 1 end) pack
from t unpivot (
    name for operation in (Ship_Operator, Pick_operator, Pack_Operator)
) as x
group by name;
产生:


unpivot
pivot
返回:

with t(task,Ship_Operator,Pick_Operator,Pack_Operator) as (
select '1','john','kevin','steve'  union all
select '2','kevin','kevin','john'  union all
select '3','steve','john','john'   union all
select '4','steve','steve','steve' union all
select '5','john','steve','john')
-------Test data set up ends here------------

select 
    name, Ship_Operator ship_total, Pick_Operator pick_total, Pack_Operator pack_total
from t unpivot (
    name for operation in (Ship_Operator, Pick_operator, Pack_Operator)
) as x pivot (
    count(task) for operation in ([Ship_Operator],[Pick_Operator],[Pack_Operator])
) as x;
产生:

另一种方法是仅使用
UNPIVOT
,然后有条件地聚合:

with t(task,Ship_Operator,Pick_Operator,Pack_Operator) as (
select '1','john','kevin','steve'  union all
select '2','kevin','kevin','john'  union all
select '3','steve','john','john'   union all
select '4','steve','steve','steve' union all
select '5','john','steve','john')
-------Test data set up ends here------------

select 
    name,
    count(case when operation = 'Ship_Operator' then 1 end) ship,
    count(case when operation = 'Pick_Operator' then 1 end) pick,
    count(case when operation = 'Pack_Operator' then 1 end) pack
from t unpivot (
    name for operation in (Ship_Operator, Pick_operator, Pack_Operator)
) as x
group by name;
产生:


嗯,呃,使用union?您的预期输出不正确。John在pack中有3次。GurV,非常感谢。嗯,呃,使用union?您的预期输出不正确。约翰在背包里三次了。古尔夫,非常感谢你。