Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 2008r2联合所有分组依据_Sql_Sql Server 2008 - Fatal编程技术网

SQL Server 2008r2联合所有分组依据

SQL Server 2008r2联合所有分组依据,sql,sql-server-2008,Sql,Sql Server 2008,我有以下疑问: SELECT SUM (T0.[TotalSumSy]) AS 'Line Sterling', T0.[WhsCode] AS 'Business Unit' FROM [dbo].[INV1] T0 INNER JOIN [dbo].[OINV] T1 ON T1.[DocEntry] = T0.[DocEntry] WHERE T1.[DocDate] > (CONVER

我有以下疑问:

  SELECT SUM (T0.[TotalSumSy]) AS 'Line Sterling',
         T0.[WhsCode] AS 'Business Unit'
    FROM [dbo].[INV1] T0 
         INNER JOIN [dbo].[OINV] T1 
                    ON T1.[DocEntry] = T0.[DocEntry]
   WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
GROUP BY T0.[WhsCode]

UNION ALL

  SELECT SUM (T0.[TotalSumSy] * -1) AS 'Line Sterling',
         T0.[WhsCode] AS 'Business Unit'
    FROM [dbo].[RIN1] T0 
         INNER JOIN [dbo].[ORIN] T1 
                    ON T1.[DocEntry] = T0.[DocEntry]
   WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
GROUP BY T0.[WhsCode]
但是,这将返回2组。我明白为什么,但我不知道如何解决。 有人能帮忙吗?

试试以下方法:

select sum([TotalSumSy]), WhsCode  AS 'Business Unit' from 
(
  SELECT TotalSumSy, T0.[WhsCode] 
  FROM [dbo].[RIN1] T0 INNER JOIN [dbo].[ORIN] T1 ON T1.[DocEntry] = T0.[DocEntry]
  WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )

  UNION ALL

  SELECT 
  T0.[TotalSumSy]*-1,
  T0.[WhsCode] 
  FROM [dbo].[INV1] T0 INNER JOIN [dbo].[OINV] T1 ON T1.[DocEntry] = T0.[DocEntry]
  WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
  ) x
group by WhsCode
尝试以下方法:

select sum([TotalSumSy]), WhsCode  AS 'Business Unit' from 
(
  SELECT TotalSumSy, T0.[WhsCode] 
  FROM [dbo].[RIN1] T0 INNER JOIN [dbo].[ORIN] T1 ON T1.[DocEntry] = T0.[DocEntry]
  WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )

  UNION ALL

  SELECT 
  T0.[TotalSumSy]*-1,
  T0.[WhsCode] 
  FROM [dbo].[INV1] T0 INNER JOIN [dbo].[OINV] T1 ON T1.[DocEntry] = T0.[DocEntry]
  WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
  ) x
group by WhsCode

我建议首先创建一个视图。然后在该视图上应用GROUPBY子句

create view v1 as (
SELECT 
T0.[TotalSumSy] AS 'Line Sterling',
T0.[WhsCode] AS 'Business Unit'
FROM [dbo].[INV1] T0 INNER JOIN [dbo].[OINV] T1 ON T1.[DocEntry] = T0.[DocEntry]
WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )

UNION ALL

SELECT 
T0.[TotalSumSy] * -1 AS 'Line Sterling',
T0.[WhsCode] AS 'Business Unit'
FROM [dbo].[RIN1] T0 INNER JOIN [dbo].[ORIN] T1 ON T1.[DocEntry] = T0.[DocEntry]
WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
)
然后通过以下方式应用该组:

SELECT 
SUM (Line Sterling) AS 'Line Sterling', [Business Unit]
FROM v1
GROUP BY [Business Unit]

我建议首先创建一个视图。然后在该视图上应用GROUPBY子句

create view v1 as (
SELECT 
T0.[TotalSumSy] AS 'Line Sterling',
T0.[WhsCode] AS 'Business Unit'
FROM [dbo].[INV1] T0 INNER JOIN [dbo].[OINV] T1 ON T1.[DocEntry] = T0.[DocEntry]
WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )

UNION ALL

SELECT 
T0.[TotalSumSy] * -1 AS 'Line Sterling',
T0.[WhsCode] AS 'Business Unit'
FROM [dbo].[RIN1] T0 INNER JOIN [dbo].[ORIN] T1 ON T1.[DocEntry] = T0.[DocEntry]
WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
)
然后通过以下方式应用该组:

SELECT 
SUM (Line Sterling) AS 'Line Sterling', [Business Unit]
FROM v1
GROUP BY [Business Unit]

执行此查询还有另一个选项,即只执行一次聚合

select sum("Line Sterling") as [Line Sterling], [Business Unit]
from ((SELECT T0.[TotalSumSy] AS [Line Sterling], T0.[WhsCode] AS [Business Unit], t1.DocDate
       FROM [dbo].[INV1] T0 INNER JOIN
            [dbo].[OINV] T1 
            ON T1.[DocEntry] = T0.[DocEntry]
      ) union all
      (SELECT T0.[TotalSumSy] * -1, T0.[WhsCode], t1.DocDate
       FROM [dbo].[RIN1] T0 INNER JOIN
            [dbo].[ORIN] T1 
            ON T1.[DocEntry] = T0.[DocEntry]
      )
     ) t
where [DocDate] > CONVERT(DATETIME, '20121001', 112)
group by [Business Unit];
这是否比预聚合、执行联合和再次聚合的性能更好取决于许多因素。然而,这确实将聚合和过滤的逻辑放在了一个地方。这意味着更容易修改和维护查询而不会出错


注意,我还更改了列名的转义字符。单引号只能用于字符串和日期常量。将它们用于标识符(列别名)可能会导致查询中难以检测错误。

执行此查询还有另一个选项,即仅执行一次聚合

select sum("Line Sterling") as [Line Sterling], [Business Unit]
from ((SELECT T0.[TotalSumSy] AS [Line Sterling], T0.[WhsCode] AS [Business Unit], t1.DocDate
       FROM [dbo].[INV1] T0 INNER JOIN
            [dbo].[OINV] T1 
            ON T1.[DocEntry] = T0.[DocEntry]
      ) union all
      (SELECT T0.[TotalSumSy] * -1, T0.[WhsCode], t1.DocDate
       FROM [dbo].[RIN1] T0 INNER JOIN
            [dbo].[ORIN] T1 
            ON T1.[DocEntry] = T0.[DocEntry]
      )
     ) t
where [DocDate] > CONVERT(DATETIME, '20121001', 112)
group by [Business Unit];
这是否比预聚合、执行联合和再次聚合的性能更好取决于许多因素。然而,这确实将聚合和过滤的逻辑放在了一个地方。这意味着更容易修改和维护查询而不会出错


注意,我还更改了列名的转义字符。单引号只能用于字符串和日期常量。使用它们作为标识符(列别名)可能导致查询中难以检测错误。

无需查看。仅为一个查询创建视图不是一个好主意。不需要视图。仅为一个查询创建视图不是一个好主意。谢谢。我觉得你的问题更容易理解。然而,我有以下错误。Msg 8120,级别16,状态1,第7行列“dbo.RIN1.WhsCode”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。@user2694771。我在第二个子查询中保留了
sum()
,这将它转换为一个聚合。现在修好了,谢谢。我觉得你的问题更容易理解。然而,我有以下错误。Msg 8120,级别16,状态1,第7行列“dbo.RIN1.WhsCode”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。@user2694771。我在第二个子查询中保留了
sum()
,这将它转换为一个聚合。现在修好了,谢谢。第一个选择应该给我+值和第二个-值,因为它们是积分。总和将始终为+值(第一次选择-第二次选择)。然而,结果显示了所有的价值谢谢你。第一个选择应该给我+值和第二个-值,因为它们是积分。总和将始终为+值(第一次选择-第二次选择)。然而,结果显示了所有的价值观