2015-05-14 95 views
2

我有這個 表的表done_bySQL計數和SUM

Var_ID| Var_name| Q1_by |Q2_by|Q3_by|Q4_by 
1  | abc | me | me |me |you 
2  | cba | me | me |you |you 
3  | abd | me | you |you |me 

的結果,我想的就是讓所有的總我的所有 ,並且重視 我= 7 你= 5

做了計數,但我不能得到的是計數所有的「我」爲每列

+0

你使用的是什麼版本的SQL? Microsoft SQL Server,MySQL,Oracle或其他數據庫引擎? – Jaco

+1

當您想計算/比較多列中的值時,它通常是一個破損數據模型的標誌 - 這通常表示應該有單列和多行(並且「Q1」 - 「Q4」也應該出現as * data *在一個單獨的列中,而不是作爲元數據嵌入列名中) –

回答

3

你可以有條件匯聚喜歡做的事:

SELECT SUM(CASE WHEN Q1_by = 'me' THEN 1 ELSE 0 END + 
      CASE WHEN Q2_by = 'me' THEN 1 ELSE 0 END + 
      CASE WHEN Q3_by = 'me' THEN 1 ELSE 0 END + 
      CASE WHEN Q4_by = 'me' THEN 1 ELSE 0 END) AS me , 
     SUM(CASE WHEN Q1_by = 'you' THEN 1 ELSE 0 END + 
      CASE WHEN Q2_by = 'you' THEN 1 ELSE 0 END + 
      CASE WHEN Q3_by = 'you' THEN 1 ELSE 0 END + 
      CASE WHEN Q4_by = 'you' THEN 1 ELSE 0 END) AS you 
FROM TableName 
+0

感謝Giorgi Nakeuri有條件的聚合工作並給了我需要的結果,謝謝! – wicked14

0

使用每季度個別情況,並將它們添加

SELECT (
(SELECT Count(Q1_by) FROM done_by WHERE Q1_by = 'me')+ 
(SELECT Count(Q2_by) FROM done_by WHERE Q2_by = 'me')+ 
(SELECT Count(Q3_by) FROM done_by WHERE Q3_by = 'me')+ 
(SELECT Count(Q4_by) FROM done_by WHERE Q4_by = 'me')) AS MeCount, 
(
(SELECT Count(Q1_by) FROM done_by WHERE Q1_by = 'you')+ 
(SELECT Count(Q2_by) FROM done_by WHERE Q2_by = 'you')+ 
(SELECT Count(Q3_by) FROM done_by WHERE Q3_by = 'you')+ 
(SELECT Count(Q4_by) FROM done_by WHERE Q4_by = 'you')) AS YouCount 
FROM done_by 

IDEONE鏈接:使用「求和」,而不是「計數」 https://ideone.com/ZAuS5O

0

有條件的聚集體的路要走,你可以擴展它使用動態SQL,如果你不知道不同的值 -

--Dynamic SQL Extension to count sum of all distinct values 
--Extract out distinct values in temporary table 
SELECT DISTINCT by_val=val INTO #by_tbl FROM (SELECT val=Q1_by 
FROM #TableName 
UNION ALL 
SELECT val=Q2_by 
FROM #TableName 
UNION ALL 
SELECT val=Q3_by 
FROM #TableName 
UNION ALL 
SELECT val=Q4_by 
FROM #TableName) A 


--Create a SQL String 
DECLARE @sql NVARCHAR(max) 

SELECT @sql = ISNULL(@sql+',', 'SELECT ') + '['+by_val+']=SUM(CASE WHEN Q1_by='''+by_val+''' THEN 1 ELSE 0 END 
       + CASE WHEN Q2_by='''+by_val+''' THEN 1 ELSE 0 END 
       + CASE WHEN Q3_by='''+by_val+''' THEN 1 ELSE 0 END 
       + CASE WHEN Q4_by='''+by_val+''' THEN 1 ELSE 0 END) ' 

FROM #by_tbl 

SET @sql = @sql + ' FROM #TableName' 

EXEC(@SQL) 


DROP TABLE #TableName 
DROP TABLE #by_tbl 
0
DECLARE @byMe INT = 0; 

SELECT @byMe = @byMe + COUNT(*) FROM dbo.tablName 
WHERE Q1_by = 'me'; 

SELECT @byMe = @byMe + COUNT(*) FROM dbo.tablName 
WHERE Q2_by = 'me'; 

SELECT @byMe = @byMe + COUNT(*) FROM dbo.tablName 
WHERE Q3_by = 'me'; 

SELECT @byMe = @byMe + COUNT(*) FROM dbo.tablName 
WHERE Q4_by = 'me'; 

SET @byMe = @byMe * 7;