[英]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.