如何旋转T-SQL查询输出以获得此特定表?

时间:2018-09-18 05:42:38

标签: sql sql-server tsql pivot

我正在T-SQL上运行SQL Server 2014查询。查询及其输出如下:

Use MyDatabase
   SELECT 
   ID,
   ArrivalMonth,
   DateOfBirth
   FROM [View1]
   WHERE [ArrivalMonth] between '2017-01-01' and '2018-05-01'

上面查询的输出看起来像这样(提取):

 ID    ArrivalMonth     DateOfBirth
 101   2017-01-01       1974-05-30
 105   2017-05-01       1967-03-05
 125   2017-05-01       NULL
 ...   ...              ...

我需要一个T-SQL查询才能为我提供以下输出(基于上面的输出):

 ArrivalMonth   Number_Of_Bookings    Number_Of_DOB_Captured
 2017-01-01         130                 110
 2017-02-01          90                  85
 ...                ...                 ...
 2018-05-01         115                  70

第一列是ArrivalMonthNumber_Of_Bookings是上述查询中的记录数。 Number_Of_DOB_CapturedDateOfBirth的计数,即NOT NULL

我认为可能是Pivot查询可能是解决方案,但对于在这种情况下如何执行它,我感到困惑。

2 个答案:

答案 0 :(得分:1)

您可以将包含所有月份的日历表加入当前表,然后进行汇总:

WITH months AS (
    SELECT '2017-01-01' AS month UNION ALL
    SELECT '2017-02-01' UNION ALL
    ...
    SELECT '2017-12-01'
)

SELECT
    m.month,
    COUNT(*) AS Number_Of_Bookings,
    COUNT(v.DateOfBirth) AS Number_Of_DOB_Captured
FROM months m
LEFT JOIN [View1] v
    ON m.month = v.ArrivalMonth
WHERE
    v.ArrivalMonth BETWEEN '2017-01-01' AND '2018-05-01'
GROUP BY
    m.month;

如果由于某种原因,给定的到达月份在您的视图中没有与之相关联的数据,则可能需要日历表。如果确定该视图将始终包含每个月的数据,则可以直接在表上进行聚合而无需加入。

答案 1 :(得分:0)

您可以使用textViewHeightConstraint.constant = self.textView.contentSize.height count(Number_Of_Bookings)count(DateOfBirth)

因此,您需要为每个不同的group by ArrivalMonth计算非空值的数量。

查询:

ArrivalMonth