Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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中显示年份_Sql_Sql Server - Fatal编程技术网

如何在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