2017-10-04 110 views
0

我有大数据集,我想比较数据。比如预算和实际的比较。根据讨论哪个(管理)级别,我需要类似的查询。Full Outer将两个选择合并为一个数据集进行分析

数据集:

Year    float 
Period    float 
Weeknumber   float 
Account    nvarchar(255) 
Customer   nvarchar(255) 
Account manager  nvarchar(255) 
Market    nvarchar(255) 
Country    nvarchar(255) 
Customercode  float 
Customername  nvarchar(255) 
Article    float 
Description   nvarchar(255) 
Productgroup  nvarchar(255) 
Line    nvarchar(255) 
Fresh    nvarchar(255) 
OwnProduction  nvarchar(255) 
NNNRevenue   decimal(10, 2) 
CM     decimal(10, 2) 
Pieces    decimal(10, 2) 
KG     decimal(10, 2) 
TriggerId   nvarchar(255) 
YearWeek   nvarchar(255) 

的最基本的查询:

SELECT [Article] 
     ,sum([NNNRevenue]) as Revenue 
     ,sum([Pieces]) as Pieces 
     ,sum([KG]) as KG 

    FROM [PP_Test].[dbo].[history] 

    where year = '2018' 
    and period = '2' 

    group by Article 
    order by Article 

结果将类似于:

Article Revenue Pieces KG 
6852  123548,12 654813 13248,61 
10031 489642,15 4687896 56478,54 
4477  4698,78 54846 46,15 

我有[PP_Test]完全相同的查询[DBO] 。[预算]。我需要的是一个(完整的?)加入,我的新结果将是预算或历史文件中的任何文章。

结果举例想:

Article H.Revenue H.Pieces H.KG  B.Revenue B.Pieces B.KG 
6852  123548,12 654813 13248,61 51346,12 321558 87156,12 
10031 489642,15 4687896 56478,54 541326  21314  13215,15 
4477  4698,78 54846 46,15  321564,74 14548  132147,87 
16531 0   0  0   1278,15 1348  1348,15 
55555 123151,15 13234 154884 0   0   0 

我的代码

SELECT h.[Article] 
     ,sum([NNNRevenue]) as RevenueHis 
     ,sum([Pieces]) as PiecesHis 
     ,sum([KG]) as KGHis 
    ,RevenueBud 
    ,PiecesBud 
    ,KgBud 

    FROM 
    (
SELECT [Article] 
     ,sum([NNNrevenue]) as RevenueBud 
     ,sum([Pieces]) as PiecesBud 
     ,sum([KG]) as KGBud 

    FROM [PP_Test].[dbo].[budget] 

    Where year = '2018' 
    and Period = '2' 
    group by Article 
) as B 

    Full outer join [PP_Test].[dbo].[history] as H 
    on B.Article = H.Article 

    where year = '2018' 
    and period = '2' 

    group by h.Article, RevenueBud, PiecesBud, KGBud 
    order by h.Article 

这将导致表我想,但我想它存在于预算,但没有在历史上(实际值)的项目。这似乎是由于h.article上的选择,但我需要这样做,以避免模糊的名称错误。

当我得到这个工作,我想复制它到不同的层次,如客户/文章/行等的分析,并作为下一步在srss报告变量声明和用户使用期间进行选择,年等。

回答

0

full outer join上过滤很棘手。一种方法是使用子查询:

SELECT COALESCE(B.Article, h.Article) as Article, 
     RevenueHis, PiecesHis, KGHis, 
     RevenueBud, PiecesBud, KgBud 
FROM (SELECT [Article], sum([NNNrevenue]) as RevenueBud, 
      sum([Pieces]) as PiecesBud, sum([KG]) as KGBud 
     FROM [PP_Test].[dbo].[budget] 
     WHERE year = 2018 AND Period = 2 
     GROUP BY Article 
    ) B FULL JOIN 
    (SELECT Article, sum([NNNRevenue]) as RevenueHis, 
      sum([Pieces]) as PiecesHis, sum([KG]) as KGHis 
     FROM [PP_Test].[dbo].[history] as H 
     WHERE year = 2018 AND period = 2 
     GROUP BY Article 
    ) H 
    ON B.Article = H.Article 
ORDER BY h.Article; 

注:存储yearperiod作为float是愚蠢的。 INT是有道理的。 DECIMAL(4)是有道理的。即使是一串。但不要使用浮点表示,除非这是你真正想要的。

同样,不要在数字常量周围放置单引号。单引号只能用于日期和字符串常量。

+0

就数据类型达成一致,这只是我“继承”它的方式。如果我重新创建数据可能会做不同。 –

+0

当我在Microsoft SQL Server上尝试您的代码时,出现错误:Msg 156,Level 15,State 1,Line 15 关键字'ON'附近的语法错误。 –

+0

感谢这真的接近我需要的东西,现在我有几行null作为值,这我不介意,但也有一些行作为文章号为null,这是进一步分析的问题。 –