我最近做了一个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)是
- 我怎样才能得到正确的结果一个枢轴?
- 对于我自己的学习 - 我做错了什么?此代码,我生产的查询之间
差异是
我从意见的生产,而不是使用表变量在生产跨度 结果一年多选择,我刚离开“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;