基于两列之间的值的SQL透视

基于两列之间的值的SQL透视,sql,sql-server-2005,tsql,Sql,Sql Server 2005,Tsql,我有一个表,其中有两列,一列是开始日期,另一列是结束日期。我需要编写一个查询,该查询将为一年中的每个月返回一列,如果该月介于0之间,则该列的值为1,否则。PIVOT语句似乎就是我在这里寻找的,但从最好的情况来看,PIVOT子句是在寻找匹配的值,而不是检查值是否在其他两个值之间。PIVOT子句在这里是正确的构造吗?还是我需要分解并编写12个case语句,然后将它们聚合起来?我将使用12个case语句 这实际上是我回去之前草拟的解决方案,你在其中提到了你的问题。我想我已经找到了解决方案。有3个基本步

我有一个表,其中有两列,一列是开始日期,另一列是结束日期。我需要编写一个查询,该查询将为一年中的每个月返回一列,如果该月介于0之间,则该列的值为1,否则。PIVOT语句似乎就是我在这里寻找的,但从最好的情况来看,PIVOT子句是在寻找匹配的值,而不是检查值是否在其他两个值之间。PIVOT子句在这里是正确的构造吗?还是我需要分解并编写12个case语句,然后将它们聚合起来?

我将使用12个case语句


这实际上是我回去之前草拟的解决方案,你在其中提到了你的问题。

我想我已经找到了解决方案。有3个基本步骤:

在12个月内的每个月内获得a日期 检查此日期是否介于开始日期和结束日期之间 旋转结果 为了得到12个日期,每个月一个,我使用了一个类似WITH的递归语句来创建一个临时表,其中有1列12个日期:

WITH months (date) AS (
SELECT GETDATE() AS date
UNION ALL
SELECT 
    DATEADD(MONTH,1,date)
FROM months
WHERE DATEDIFF(MONTH,GETDATE(),date) < 12)
在这一步中,我们必须小心地只选择我们在结果中明确想要的列,或者那些将使用PIVOT语句聚合的列

最后,我们必须以结果为中心:

PIVOT (MAX(PID) FOR date IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]))
因此,生成的查询可能类似于:

WITH months (date) AS (
SELECT GETDATE() AS date
UNION ALL
SELECT 
DATEADD(MONTH,1,date)
FROM months
WHERE DATEDIFF(MONTH,GETDATE(),date) < 12)
SELECT  Title,
    [1]     AS January,
    [2]     AS February,
    [3]     AS March,
    [4]     AS April,
    [5]     AS May,
    [6]     AS June,
    [7]     AS July,
    [8]     AS August,
    [9]     AS September,
    [10]    AS October,
    [11]    AS November,
    [12]    AS December
FROM
(
SELECT other.Title,MONTH(months.date)
CROSS JOIN other
WHERE months.date BETWEEN other.startDate AND other.endDate
) AS subquery
PIVOT (MAX(PID) FOR date IN
([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) AS p

我已经去掉了所有其他的复杂性,加入了我需要的其他信息,所以这实际上不是我编写的查询,但它应该封装了我用来获得我需要的结果的基本查询结构。

为什么不计算一个月的列,然后用它来透视

datepartmonth[日期]

还是我误解了这个问题

WITH months (date) AS (
SELECT GETDATE() AS date
UNION ALL
SELECT 
DATEADD(MONTH,1,date)
FROM months
WHERE DATEDIFF(MONTH,GETDATE(),date) < 12)
SELECT  Title,
    [1]     AS January,
    [2]     AS February,
    [3]     AS March,
    [4]     AS April,
    [5]     AS May,
    [6]     AS June,
    [7]     AS July,
    [8]     AS August,
    [9]     AS September,
    [10]    AS October,
    [11]    AS November,
    [12]    AS December
FROM
(
SELECT other.Title,MONTH(months.date)
CROSS JOIN other
WHERE months.date BETWEEN other.startDate AND other.endDate
) AS subquery
PIVOT (MAX(PID) FOR date IN
([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) AS p