2011-10-24 43 views
0

我有這個疑問SQL計數加入

SELECT semester, COUNT(id) AS total, RIGHT(RTRIM(semester), 4) AS year 
FROM TextbookReservation 
WHERE (semester IS NOT NULL) 
AND (semester <> '') 
AND (semester <> 'SM2008') 
AND semester <> 'SU2008') 
GROUP BY semester ORDER BY year, semester DESC 

將會產生這樣的:

semester total year 
SP2006 2277 2006 
FA2006 4367 2006 
SP2007 2893 2007 
FA2007 5624 2007 
SP2008 4083 2008 
FA2008 6451 2008 

我想回這樣的事:

year totalSpring totalFall 
2006 2277  4367 
2007 2893  5624 
2008 4083  6451 

任何想法關於如何處理這個查詢?謝謝!

回答

3

沒有透視表,因爲你沒有指定版本:

SELECT [year], 
sum(case WHEN left(semester,2)='SP' then total ELSE 0 END) as totalSpring , 
sum(case WHEN left(semester,2)='FA' THEN total else 0 end) as totalFall 
from (

     SELECT semester 
      , count(id) AS total 
      , right(RTRIM(semester), 4) AS year 
     FROM 
      TextbookReservation 
     WHERE 
      semester IS NOT NULL 
      AND semester <> '' 
      AND semester <> 'SM2008' 
      AND semester <> 'SU2008' 
     GROUP BY 
      semester 
) t 
GROUP BY t.[year] 
order by t.[year] 
+0

完美!謝謝。使用sql2008;我也必須按照Doug的建議來看看樞軸。 – gnome

2

你想要做的是創建一個pivot。版本2005及更高版本的SQL具有內置命令來轉發數據。

您可以指定您的數據庫正在使用哪個版本的SQL Server?

PS。您還可以在2005年之前使用Case語句來做到這一點。因爲您的示例只有兩個不同的學期值,我將使用該方法提供答案。

Select year, SUM(TotalSpring), SUM(TotalFall) From 
(select RIGHT(RTRIM(semester), 4) AS year, case LEFT(semester,2) when 'SP' then 1 else 0 end TotalSpring, case LEFT(semester,2) when 'FA' then 1 else 0 end TotalFall 
from TextbookReservation 
WHERE (semester IS NOT NULL) 
AND (semester <> '') 
AND (semester <> 'SM2008') 
AND semester <> 'SU2008') as t1 
group by year 
order by year 
0

其他答案的簡化版:

SELECT 
    RIGHT(RTRIM(semester), 4) year, 
    COUNT(CASE WHEN left(semester,2)='SP' then id else null end) totalSpring, 
    COUNT(CASE WHEN left(semester,2)='FA' then id else null end) totalFall 
FROM TextbookReservation 
WHERE (semester IS NOT NULL) 
     AND (semester <> '') 
     AND (semester <> 'SM2008') 
     AND (semester <> 'SU2008') 
GROUP BY RIGHT(RTRIM(semester), 4) 
ORDER BY RIGHT(RTRIM(semester), 4) DESC 

這裏,測試腳本:

CREATE TABLE #TextbookReservation 
(
    semester VARCHAR(6), 
    id INT 
) 

INSERT INTO #TextbookReservation VALUES ('SP2006', 1) 
INSERT INTO #TextbookReservation VALUES ('SP2006', 2) 
INSERT INTO #TextbookReservation VALUES ('SP2006', 3) 
INSERT INTO #TextbookReservation VALUES ('SP2006', 4) 
INSERT INTO #TextbookReservation VALUES ('SP2006', 5) 
INSERT INTO #TextbookReservation VALUES ('FA2006', 1) 
INSERT INTO #TextbookReservation VALUES ('FA2006', 2) 
INSERT INTO #TextbookReservation VALUES ('FA2006', 3) 
INSERT INTO #TextbookReservation VALUES ('SP2007', 1) 
INSERT INTO #TextbookReservation VALUES ('SP2007', 2) 
INSERT INTO #TextbookReservation VALUES ('FA2007', 1) 
INSERT INTO #TextbookReservation VALUES ('FA2007', 2) 
INSERT INTO #TextbookReservation VALUES ('FA2007', 3) 
INSERT INTO #TextbookReservation VALUES ('FA2007', 4) 
INSERT INTO #TextbookReservation VALUES ('FA2007', 5) 

SELECT 
    RIGHT(RTRIM(semester), 4) year, 
    COUNT(CASE WHEN left(semester,2)='SP' then id else null end) totalSpring, 
    COUNT(CASE WHEN left(semester,2)='FA' then id else null end) totalFall 
FROM #TextbookReservation 
WHERE (semester IS NOT NULL) 
     AND (semester <> '') 
     AND (semester <> 'SM2008') 
     AND (semester <> 'SU2008') 
GROUP BY RIGHT(RTRIM(semester), 4) 
ORDER BY RIGHT(RTRIM(semester), 4) DESC 


DROP TABLE #TextbookReservation 
+0

這裏我沒有看到太多的簡化。我的內在選擇只是OP的原始選擇。 Saludos,同胞。 :) – Icarus

+0

你是對的:它不是太簡單。然而,我很討厭內心的選擇,所以這是我發佈的動力。 Saludos公司不願放棄我的信息! – daniloquio