Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 2008_Tsql - Fatal编程技术网

Sql server 联合、加入或分组

Sql server 联合、加入或分组,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我有程序从各种来源提取数据,给我3个非常相似的表 Metric | Tickets |Band ______________________________________ Acknowledgement | 45 | New Acknowledgement | 23 | Within Acknowledgement | 16 | Near Acknowledgement | 2 | Very Near 及 及 现

我有程序从各种来源提取数据,给我3个非常相似的表

Metric          | Tickets   |Band
______________________________________
Acknowledgement | 45        | New
Acknowledgement | 23        | Within
Acknowledgement | 16        | Near
Acknowledgement | 2         | Very Near

现在,我想以某种方式将它们组合在一起,得到一个这样的表输出

Metric          | New   | Within | Near | Very Near
_____________________________________________________
Acknowledgement | 45    | 23     | 16   | 2
Escalation      | 10    | 43     | 81   | 6
Fixed           | 34    | 52     | 36   | 4

请问,我如何在MS SQLServer中实现这一点?

这是一个假的pivot,应该可以满足您的需要。然后对每个表合并此查询

SELECT 
    Metric,
    MAX( CASE Band WHEN 'New' THEN Tickets ELSE '' END ) New, 
    MAX( CASE Band WHEN 'Within' THEN Tickets ELSE '' END ) Within, 
    MAX( CASE Band WHEN 'Near' THEN Tickets ELSE '' END ) Near, 
    MAX( CASE Band WHEN 'Very Near' THEN Tickets ELSE '' END ) [Very Near]
FROM 
    table
GROUP BY 
    Metric

UNION
...

这是一个假轴,应该得到你想要的。然后对每个表合并此查询

SELECT 
    Metric,
    MAX( CASE Band WHEN 'New' THEN Tickets ELSE '' END ) New, 
    MAX( CASE Band WHEN 'Within' THEN Tickets ELSE '' END ) Within, 
    MAX( CASE Band WHEN 'Near' THEN Tickets ELSE '' END ) Near, 
    MAX( CASE Band WHEN 'Very Near' THEN Tickets ELSE '' END ) [Very Near]
FROM 
    table
GROUP BY 
    Metric

UNION
...

这不需要为每个表重复所有的聚合和CASE表达式,只需一个简单的联合就可以了,然后您就可以摆脱它了

SELECT Metric, [New], [Within], [Near], [Very Near] FROM 
(
            SELECT Metric, Tickets, Band FROM dbo.table_a
  UNION ALL SELECT Metric, Tickets, Band FROM dbo.table_b
  UNION ALL SELECT Metric, Tickets, Band FROM dbo.table_c
) 
AS x PIVOT 
(
  MAX(Tickets) FOR Band IN ([New],[Within],[Near],[Very Near])
) AS p;

这不需要为每个表重复所有的聚合和CASE表达式,只需一个简单的联合就可以了,然后您就可以摆脱它了

SELECT Metric, [New], [Within], [Near], [Very Near] FROM 
(
            SELECT Metric, Tickets, Band FROM dbo.table_a
  UNION ALL SELECT Metric, Tickets, Band FROM dbo.table_b
  UNION ALL SELECT Metric, Tickets, Band FROM dbo.table_c
) 
AS x PIVOT 
(
  MAX(Tickets) FOR Band IN ([New],[Within],[Near],[Very Near])
) AS p;

为什么你不在一个表中列出所有12个条目呢?这个问题和答案会给你很多信息-有帮助吗@Pheonixblade9-这类问题通常是毫无意义的。。。通常,当一个人问这类问题时,模式已经定义好了,几乎没有什么办法可以改变它。@Stefan我应该重申我的问题:为什么OP没有一个包含所有12个条目的视图?这将大大简化问题。@Pheonixblade9所以,该视图需要包含一个执行什么操作的查询?哦,是的,该视图中的查询需要执行OP在这个问题中要求的操作…为什么不让一个表中包含所有12个条目?这个问题和答案将为您提供大量信息-有帮助吗@Pheonixblade9-这类问题通常是毫无意义的。。。通常,当一个人问这类问题时,模式已经定义好了,几乎没有什么办法可以改变它。@Stefan我应该重申我的问题:为什么OP没有一个包含所有12个条目的视图?这将大大简化问题。@Pheonixblade9所以,该视图需要包含一个执行什么操作的查询?哦,是的,该视图中的查询需要执行OP在这个问题中要求的操作…+1但是最后一个聚合中的票证数据是什么?在SUMCASE Band中,当“新”时,也将使用总和聚合,然后票证0结束新+1,但最后一个聚合中的票证数据是什么?在SUMCASE Band中,当“新”时,也会使用总和聚合,然后票0结束新是的,这肯定是一个更好的问题。是的,这肯定是一个更好的问题。