如何在SQL中显示年份
我能够在某个日期将物品计数分为三年前和三年后,但我无法在三年内打破物品计数如何在SQL中显示年份,sql,sql-server,Sql,Sql Server,我能够在某个日期将物品计数分为三年前和三年后,但我无法在三年内打破物品计数 SELECT ITEM, CASE WHEN DATE >='12/6/02' AND DATE <'12/6/05' AND ITEM ='RICE' THEN 'RICE PRIOR' CASE WHEN DATE >='12/06/05' AND DATE <'12/6/08' AND ITEM ='RICE' THEN 'RICE POST' END AS TYPE, COUNT (QTY
SELECT
ITEM,
CASE WHEN DATE >='12/6/02' AND DATE <'12/6/05' AND ITEM ='RICE' THEN 'RICE PRIOR'
CASE WHEN DATE >='12/06/05' AND DATE <'12/6/08' AND ITEM ='RICE' THEN 'RICE POST'
END AS TYPE,
COUNT (QTY) AS RICE
FROM #TEMP
WHERE DATE >='12/6/02'
AND DATE <'12/6/08'
GROUP BY ITEM,
CASE WHEN DATE >='12/6/02' AND DATE <'12/6/05' AND ITEM ='RICE' THEN 'RICE PRIOR'
CASE WHEN DATE >='12/06/05' AND DATE <'12/6/08' AND ITEM ='RICE' THEN 'RICE POST'
END
我想要的输出是这样的:
Year3, Year2, Year1 Year1, Year2, Year3
4 44 400 5 500 50
这应该使用pivot和date参数匹配您想要的查询,这样您就不必硬编码所有的日期和条件
DECLARE @Date DATE = '12/6/2005'
SELECT
ITEM,
[-3] AS Year3,
[-2] AS Year2,
[-1] AS Year1,
[1] AS Year1,
[2] AS Year2,
[3] AS Year3
FROM (
SELECT
ITEM,
DATEDIFF(DD, @Date, [DATE]) / 365
+ CASE WHEN @Date < [DATE] THEN 1 ELSE -1 END AS [YR],
QTY
FROM #TEMP
) T
PIVOT (MAX(QTY) FOR [YR] IN ([-3], [-2], [-1], [1], [2], [3])) PVT
根据您的示例输出,我认为下面这样的查询可能是您想要的。您可能需要调整日期范围以满足您的需要,但总体思路应该很清楚:
DECLARE @d date = '2005-07-27';
WITH cte AS
(
SELECT
ITEM
, SUM(CASE WHEN DATE BETWEEN DATEADD(YEAR, -3, @D) AND DATEADD(YEAR, -2, @D) AND ITEM ='RICE' THEN QTY END) 'RICE PRIOR -3'
, SUM(CASE WHEN DATE BETWEEN DATEADD(YEAR, -2, @D) AND DATEADD(YEAR, -1, @D) AND ITEM ='RICE' THEN QTY END) 'RICE PRIOR -2'
, SUM(CASE WHEN DATE BETWEEN DATEADD(YEAR, -1, @D) AND DATEADD(YEAR, -0, @D) AND ITEM ='RICE' THEN QTY END) 'RICE PRIOR -1'
, SUM(CASE WHEN DATE BETWEEN DATEADD(YEAR, +0, @D) AND DATEADD(YEAR, +1, @D) AND ITEM ='RICE' THEN QTY END) 'RICE POST +1'
, SUM(CASE WHEN DATE BETWEEN DATEADD(YEAR, +1, @D) AND DATEADD(YEAR, +2, @D) AND ITEM ='RICE' THEN QTY END) 'RICE POST +2'
, SUM(CASE WHEN DATE BETWEEN DATEADD(YEAR, +2, @D) AND DATEADD(YEAR, +3, @D) AND ITEM ='RICE' THEN QTY END) 'RICE POST +3'
FROM #TEMP
WHERE DATE >='2002-05-12' AND DATE <'2008-06-12'
GROUP BY ITEM
)
SELECT * FROM CTE;
因此,基本上,您可以在PIVOT的select部分中应用您的计数逻辑,然后根据年份来透视结果集
SELECT ITEM, [2002] AS[Year-3],[2003] AS [Year-2], [2004] AS [Year-1],
[2005] AS [Year1],[2006] AS [Year2],[2007] AS [Year3]
FROM (
-- Your logic here
SELECT
ITEM,
YEAR(Date) as Y,
COUNT (quantity) AS RICE
FROM [dbo].[temp]
WHERE DATE >='12/6/01'
AND DATE <'12/6/08'
GROUP BY ITEM,YEAR(Date)
) as s
PIVOT
(
SUM(RICE)
FOR Y IN ([2002], [2003], [2004], [2005],[2006],[2007])
)AS p
Sql小提琴链接
你能发布一些预期结果的样本数据吗?首先是一个小评论。如果日期介于“2012/06/02”和“2015/06/05”之间,则更易于使用。可能仅按年份日期分组就足以满足您的需要needs@Tom只需一个小注释,中间是包含的,而他的条件不是包含的,所以要知道测试日期边界,以确保它们按照您的要求工作。@Jeremy您是对的。您使用的是哪种DBMS?博士后?Oracle?这也是一个很好的解决方案。条件聚合稍微干净了一点。@Jason W。这是好东西。然而,当把三年加在一起时,数字与总数不匹配。我想知道2008年是不是闰年?谢谢你的帮助。@joe 2008和2004年一样,确实是闰年。我只是很快想出了一个方法来向你展示一个支点。您可以通过除以365.25或将@JPW计算年份偏移量的方法合并到此透视图中,使其更加准确。添加闰年帐户。刚刚更新的答案还显示了闰年帐户。@DhruvJoshi,感谢快速脚本。我相应地修改了它,但当把这一年加在一起时,总和不等于三年的总和。不知道为什么。仍然在解决问题…@joe我希望这个异常不是Sql fiddle示例。请注意,SQLFiddle在顶部逻辑部分有sum而不是count,因为我没有太多数据来显示有意义的计数结果。请根据您的需要修改您的逻辑。如果这不是您所讨论的SQLFIDLE示例,我怀疑where子句就是筛选数据的内容。
DECLARE @d date = '2005-07-27';
WITH cte AS
(
SELECT
ITEM
, SUM(CASE WHEN DATE BETWEEN DATEADD(YEAR, -3, @D) AND DATEADD(YEAR, -2, @D) AND ITEM ='RICE' THEN QTY END) 'RICE PRIOR -3'
, SUM(CASE WHEN DATE BETWEEN DATEADD(YEAR, -2, @D) AND DATEADD(YEAR, -1, @D) AND ITEM ='RICE' THEN QTY END) 'RICE PRIOR -2'
, SUM(CASE WHEN DATE BETWEEN DATEADD(YEAR, -1, @D) AND DATEADD(YEAR, -0, @D) AND ITEM ='RICE' THEN QTY END) 'RICE PRIOR -1'
, SUM(CASE WHEN DATE BETWEEN DATEADD(YEAR, +0, @D) AND DATEADD(YEAR, +1, @D) AND ITEM ='RICE' THEN QTY END) 'RICE POST +1'
, SUM(CASE WHEN DATE BETWEEN DATEADD(YEAR, +1, @D) AND DATEADD(YEAR, +2, @D) AND ITEM ='RICE' THEN QTY END) 'RICE POST +2'
, SUM(CASE WHEN DATE BETWEEN DATEADD(YEAR, +2, @D) AND DATEADD(YEAR, +3, @D) AND ITEM ='RICE' THEN QTY END) 'RICE POST +3'
FROM #TEMP
WHERE DATE >='2002-05-12' AND DATE <'2008-06-12'
GROUP BY ITEM
)
SELECT * FROM CTE;
SELECT ITEM, [2002] AS[Year-3],[2003] AS [Year-2], [2004] AS [Year-1],
[2005] AS [Year1],[2006] AS [Year2],[2007] AS [Year3]
FROM (
-- Your logic here
SELECT
ITEM,
YEAR(Date) as Y,
COUNT (quantity) AS RICE
FROM [dbo].[temp]
WHERE DATE >='12/6/01'
AND DATE <'12/6/08'
GROUP BY ITEM,YEAR(Date)
) as s
PIVOT
(
SUM(RICE)
FOR Y IN ([2002], [2003], [2004], [2005],[2006],[2007])
)AS p