2014-03-03 66 views
0

我最近做了一个SQL PIVOT,并且发现它并不完全正确。下面是我使用的是什么SQL Pivot不会汇总所有结果

SQL Server 2005中 供应商数据库使用供应商的观点 - 我不能创建额外的表或视图或直接查询数据表(长的故事)

我查询一组数据每月有多个条目,并将其与第二组进行联合以使我称之为数据集。我正在使用CASE WHEN来分组对象(即结果与dbid 1,7和10为'a',2,3和9为'b'等。

我旋转数据集以显示体积总和

我的问题是针对其中一个列,它没有计算数据集中所有结果,看起来是一年中的一个月,在更仔细的调查中,我看到那些缺失的数据似乎是在哪里在下面的查询中,两行数据具有相同的N_Entered值)。

我已经设法重新使用通用查询(下面)的问题。我已经在sql server express 2008 r2和sql server 2005上运行了这个,我得到了相同的结果 - 它们是

Begin_Time总计A苹果B香蕉香蕉C胡萝卜胡萝卜D狗狗 2014-02-01 00:00 :00.000 174732 44000 4591 581 208

2014年2月B的总和为4594,但是此查询返回4591.您将注意到表1中2月的'B'的两个条目的N_Entered为'3'。

如果我删除,工会与表2的数据集的部分 - 我得到正确的答案 - 4594.

我的$1米问题(S)是

  1. 我怎样才能得到正确的结果一个枢轴?
  2. 对于我自己的学习 - 我做错了什么?此代码,我生产的查询之间

差异是

我从意见的生产,而不是使用表变量在生产跨度 结果一年多选择,我刚离开“DATEDIFF子句是尝试并尽可能保持接近。

非常感谢!

declare @vartable as table (Begin_Time DateTime, Letter varchar(30), N_Entered int) 
declare @vartable2 as table (Begin_Time DateTime, Letter varchar(30), N_Entered int) 

--populate first table 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'D', 125) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'B', 2519) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'A', 23) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'A', 271) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'B', 9) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'B', 3) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'B', 37) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'A', 357) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'A', 24230) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'A', 9) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'D', 83) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'B', 1998) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'A', 13) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'A', 217) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'B', 3) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'B', 1) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'B', 24) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'A', 212) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'A', 18656) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'A', 12) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'C', 272) 
insert into @vartable (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'C', 309) 

--populate second table 
insert into @vartable2 (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'T', 1009) 
insert into @vartable2 (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'T', 90810) 
insert into @vartable2 (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'T', 198) 
insert into @vartable2 (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'T', 253) 
insert into @vartable2 (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'T', 447) 
insert into @vartable2 (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'T', 829) 
insert into @vartable2 (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'T', 80427) 
insert into @vartable2 (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'T', 152) 
insert into @vartable2 (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'T', 149) 
insert into @vartable2 (Begin_Time, Letter, N_Entered) Values ('2014-02-01 00:00:00', 'T', 458) 

SELECT * FROM 
(SELECT Begin_Time, 
CASE Letter 
     WHEN 'A' THEN 'A Apples' 
     WHEN 'B' THEN 'B Banana Bananas' 
     WHEN 'C' THEN 'C Carrot Carrots' 
     WHEN 'D' THEN 'D Dog Dogs' 
ELSE Letter 
END 'Option Selected' 
, N_Entered 
From @vartable 
WHERE (Datediff(month, begin_time, getdate()) Between 1 and 12) 
AND Letter IN ('A', 'B', 'C', 'D') -- end first select 

--removing this union section does give the right answer 

UNION 
( 
SELECT Begin_Time, 'Totals' as 'Total Numbers', Sum(N_Entered) As N_Entered 
     FROM @vartable2 
       WHERE 

          Letter IN ('T') 
         AND (Datediff(month, begin_time, getdate()) Between 1 and 12) 
       GROUP BY begin_time 
     ) -- end second select 

-- end of union section 

) As Data 

PIVOT 

( 
SUM(N_ENTERED) 
FOR [Option Selected] IN ([Totals], [A Apples], [B Banana Bananas], [C Carrot Carrots], [D Dog Dogs]) 
) 
As PivotTable; 

回答

0

替换联盟与UNION ALL

联盟消除B. UNION ALL认为重复值即值3。