簡體   English   中英

對表中所有行中與某個值匹配的COUNT個字段進行SQL查詢

[英]SQL Query to COUNT fields that match a certain value across all rows in a table

我正在嘗試(但失敗)構建一個簡單的SQL查詢(對於SQL Server 2012),該查詢計算給定日期范圍內某個值的出現次數。

這是一項調查結果的集合。

因此最終結果將顯示只有3個匹配“ 2”的值和6個匹配“ 1”的值。

如果最終結果可以返回3個值,則更好:

MatchZero = 62
MatchOne = 6
MatchTwo = 3

有點像(我知道這太可怕了):

SELECT 
  COUNT(0) AS MatchZero, 
  COUNT(1) AS MatchOne, 
  COUNT(2) As MatchTwo 
WHERE dated BETWEEN '2014-01-01' AND '2014-02-01'

我不需要按日期或其他任何東西對它進行分組,只需將它們的合計值。

任何見解都將得到極大的歡迎。

+------------+----------+--------------+-------------+------+-----------+------------+
| QuestionId | friendly | professional | comfortable | rate | recommend |   dated    |
+------------+----------+--------------+-------------+------+-----------+------------+
|          3 |        0 |            0 |           0 |    0 |         0 | 2014-02-12 |
|          9 |        0 |            0 |           0 |    0 |         0 | 2014-02-12 |
|         14 |        0 |            0 |           0 |    2 |         0 | 2014-02-13 |
|         15 |        0 |            0 |           0 |    0 |         0 | 2014-01-06 |
|         19 |        0 |            1 |           2 |    0 |         0 | 2014-01-01 |
|         20 |        0 |            0 |           0 |    0 |         0 | 2013-12-01 |
|         21 |        0 |            1 |           0 |    0 |         0 | 2014-01-01 |
|         22 |        0 |            1 |           0 |    0 |         0 | 2014-01-01 |
|         23 |        0 |            0 |           0 |    0 |         0 | 2014-01-24 |
|         27 |        0 |            0 |           0 |    0 |         0 | 2014-01-31 |
|         30 |        0 |            1 |           2 |    0 |         0 | 2014-01-27 |
|         31 |        0 |            0 |           0 |    0 |         0 | 2014-01-11 |
|         36 |        0 |            0 |           0 |    1 |         1 | 2014-01-22 |
+------------+----------+--------------+-------------+------+-----------+------------+

您可以使用條件聚合:

SELECT SUM((CASE WHEN friendly = 0 THEN 1 ELSE 0 END) +
           (CASE WHEN professional = 0 THEN 1 ELSE 0 END) +
           (CASE WHEN comfortable = 0 THEN 1 ELSE 0 END) +
           (CASE WHEN rate = 0 THEN 1 ELSE 0 END) +
           (CASE WHEN recommend = 0 THEN 1 ELSE 0 END) +
          ) AS MatchZero,
       SUM((CASE WHEN friendly = 1 THEN 1 ELSE 0 END) +
           (CASE WHEN professional = 1 THEN 1 ELSE 0 END) +
           (CASE WHEN comfortable = 1 THEN 1 ELSE 0 END) +
           (CASE WHEN rate = 1 THEN 1 ELSE 0 END) +
           (CASE WHEN recommend = 1 THEN 1 ELSE 0 END) +
          ) AS MatchOne,
       SUM((CASE WHEN friendly = 2 THEN 1 ELSE 0 END) +
           (CASE WHEN professional = 2 THEN 1 ELSE 0 END) +
           (CASE WHEN comfortable = 2 THEN 1 ELSE 0 END) +
           (CASE WHEN rate = 2 THEN 1 ELSE 0 END) +
           (CASE WHEN recommend = 2 THEN 1 ELSE 0 END) +
          ) AS MatchTwo           
FROM . . .
WHERE dated BETWEEN '2014-01-01' AND '2014-02-01';

如果我對您的理解正確,那么您希望計算表中特定列(或每個列)的零,一和二。 如果這是正確的,那么您可以執行以下操作:

select sum(case when your_column = 0 then 1 else 0 end) as zeros
     , sum(case when your_column = 1 then 1 else 0 end) as ones
     --- and so on
from your_table
-- where conditions go here

如果要計算一欄以上的總數,請將所需的case...end s括在sum()

sum(
    (case when column1 = 0 then 1 else 0 end) +
    (case when column2 = 0 then 1 else 0 end)
    -- and so on
) as zeros

使用簡單的樞軸,您可以通過更少的編碼獲得所需的結果。 通過簡單地更改日期范圍,可以計算出每種問題類型的正確計數。

SELECT 
    RANKING, COUNT(*) AS CNT 
FROM
    (SELECT 
        friendly,professional,comfortable,rate,recommend 
    FROM 
        your_table 
    WHERE 
        dated >= '1/1/1900' AND dated <= '1/1/2015'
) AS U UNPIVOT 
(RANKING FOR QUESTION IN (friendly,professional,comfortable,rate,recommend)) AS UNP
GROUP BY
    RANKING

暫無
暫無

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

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