Счетчик SQL с внутренними объединениями - PullRequest
0 голосов
/ 24 октября 2011

У меня есть этот запрос

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 ]

3 голосов
/ 24 октября 2011

Без таблиц PIVOT, поскольку вы не указали версию:

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]
2 голосов
/ 24 октября 2011

Что вы хотели бы сделать, это создать pivot . SQL версии 2005 и выше имеет встроенную команду для сводки данных.

Не могли бы вы указать, какую версию SQL Server использует ваша база данных?

PS. Вы также можете сделать это с помощью инструкций Case до 2005 г., поскольку в вашем примере только два дискретных значения для семестров, я предоставлю ответ, используя этот метод.

 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 голосов
/ 24 октября 2011

Упрощенная версия других ответов:

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
...