簡體   English   中英

SQL查詢以統計在日期范圍內與某些條件匹配的響應數,並按每天分組顯示

[英]SQL Query to Count Number of Responses Matching Certain Criteria over a Date Range and Display as Grouped per Day

我在表中有以下調查問卷集。

尚不清楚,但數字代表“滿意”級別,其中:

0 = happy
1 = neutral
2 = sad

+----------+--------+-------+------+-----------+-------------------------+
| friendly | polite | clean | rate | recommend |      booking_date       |
+----------+--------+-------+------+-----------+-------------------------+
|        2 |      2 |     2 |    0 |         0 | 2014-02-03 00:00:00.000 |
|        1 |      2 |     0 |    0 |         2 | 2014-02-04 00:00:00.000 |
|        0 |      0 |     0 |    1 |         0 | 2014-02-04 00:00:00.000 |
|        1 |      1 |     2 |    0 |         2 | 2014-02-04 00:00:00.000 |
|        0 |      0 |     1 |    2 |         1 | 2014-02-04 00:00:00.000 |
|        2 |      2 |     0 |    2 |         0 | 2014-02-05 00:00:00.000 |
|        2 |      1 |     1 |    0 |         2 | 2014-02-05 00:00:00.000 |
|        1 |      0 |     1 |    2 |         0 | 2014-02-05 00:00:00.000 |
|        0 |      1 |     1 |    1 |         1 | 2014-02-05 00:00:00.000 |
|        1 |      0 |     2 |    2 |         0 | 2014-02-05 00:00:00.000 |
+----------+--------+-------+------+-----------+-------------------------+

對於每一天,我需要與每個響應選項匹配的每一列的總計。 這將回答以下問題:“人們如何對每個可用的問題選項回答快樂,中立或悲傷”。

然后,我將要求返回一個記錄集,例如:

+------------+----------+------------+--------+----------+------------+--------+
|    Date    | FriHappy | FriNeutral | FriSad | PolHappy | PolNeutral | PolSad |
+------------+----------+------------+--------+----------+------------+--------+
| 2014-02-03 |        0 |          0 |      1 |        0 |          0 |      1 |
| 2014-02-04 |        2 |          2 |      0 |        2 |          1 |      1 |
| 2014-02-05 |        1 |          2 |      2 |        2 |          2 |      1 |
+------------+----------+------------+--------+----------+------------+--------+

這表明兩個響應者4日對“禮貌?”的回答是“高興”。 問題,一個回答“中立”,另一個回答“悲傷”。

5日,一名響應者對“友好”選項回答“高興”,兩名選擇了“中立”,兩名選擇了“悲傷”。

我真的很想避免在代碼中這樣做,但是我的SQL並不是很好。 我確實環顧四周,但找不到符合此特定要求的任何東西。

顯然,這永遠都行不通(如果可行的話),但這可能有助於解釋:

SELECT cast(booking_date as date) [booking_date], 
COUNT(friendly=0) [FriHappy],
COUNT(friendly=1) [FriNeutral],
COUNT(friendly=2) [FriSad]
FROM [u-rate-gatwick-qsm].[dbo].[Questions]
WHERE booking_date >= '2014-02-01'
AND booking_date <= '2014-03-01'
GROUP BY cast(booking_date as date) 

任何指針將不勝感激。

非常感謝。

這是示例查詢的工作版本:

SELECT cast(booking_date as date) as [booking_date], 
       sum(case when friendly = 0 then 1 else 0 end) as [FriHappy],
       sum(case when friendly = 1 then 1 else 0 end) as [FriNeutral],
       sum(case when friendly = 2 then 1 else 0 end) as [FriSad]
FROM [u-rate-gatwick-qsm].[dbo].[Questions]
WHERE booking_date >= '2014-02-01' AND booking_date <= '2014-03-01'
GROUP BY cast(booking_date as date) 
ORDER BY min(booking_date);

您的表達式count(friendly = 0)在SQL Server中不起作用。 即使這樣做,也將與count(friendly)相同-也就是說,列中非NULL值的數量。 記住count()作用。 它計算non-NULL值的數量。

上面的邏輯說:當匹配到適當的friendly值時加1。

順便說一句,SQL Server不保證聚合結果的順序,因此我還添加了order by子句。 min(booking_date)只是按日期排序的一種簡便方法。

而且,我沒有進行更改,但是我認為where的第二個條件應該是<而不是<=因此您不包括3月1日的預訂(即使是恰好在午夜)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM