Генерация двумерной таблицы результатов в SQL - PullRequest
1 голос
/ 21 апреля 2011

У меня есть список предметов, который обновляется ежедневно, и каждый предмет попадает в один из четырех ценовых диапазонов.

Следующий запрос извлекает количество элементов в каждой ценовой полосе по дате, но помещает каждую комбинацию полосы / даты в отдельную строку.

SELECT PB.band, Count(L.ID) as Count
FROM ListItem L
join PriceBand PB on L.price >= PB.loprice and L.price <= PB.hiprice
Where ListID = 1  and ranking <= 100 and band >= 1 and band <= 4
Group by date, PB.band
order by date asc, band asc

Результирующий набор выглядит следующим образом(два дня использовались для иллюстрации):

date    band    Count
2010-12-08  1   20
2010-12-08  2   17
2010-12-08  3   32
2010-12-08  4   26
2010-12-09  1   19
2010-12-09  2   16
2010-12-09  3   33
2010-12-09  4   27

Хотя я могу повторить эту процедуру, чтобы создать таблицу, которую я действительно хочу, есть ли разумный способ написать запрос для возврата данных в двумерной формеследующим образом:

date        band1   band2   band2   band3   
2010-12-08  20      17      32      26
2010-12-09  19      16      33      27

Спасибо всем.

Ответы [ 3 ]

4 голосов
/ 21 апреля 2011
SELECT [date],
       COUNT(CASE WHEN PB.band = 1 THEN L.ID END) AS band1,
       COUNT(CASE WHEN PB.band = 2 THEN L.ID END) AS band2,
       COUNT(CASE WHEN PB.band = 3 THEN L.ID END) AS band3,
       COUNT(CASE WHEN PB.band = 4 THEN L.ID END) AS band4
FROM ListItem L
join PriceBand PB on L.price >= PB.loprice and L.price <= PB.hiprice
Where ListID = 1  and ranking <= 100 and band >= 1 and band <= 4
Group by date
order by date asc
3 голосов
/ 21 апреля 2011

Проверьте предложение PIVOT в T-SQL. => Страница MSDN

Я не уверен в точной форме запроса, но он должен выглядеть примерно так (пожалуйста, дайте мне знать, если он работает):

SELECT [date],[1],[2],[3],[4]
FROM ListItem L
join PriceBand PB on L.price >= PB.loprice and L.price <= PB.hiprice
Where ListID = 1  and ranking <= 100 and band >= 1 and band <= 4
PIVOT(COUNT(L.ID) FOR PB.band IN([1],[2],[3],[4])) as pvt   
order by [date] asc
2 голосов
/ 21 апреля 2011

Во-первых, "date" - это ужасное имя столбца, так что я надеюсь, что это только пример. Во-вторых, поскольку вы не использовали псевдоним с ним, я понятия не имею, в какой именно таблице он находится, поэтому я предпочитаю:

SELECT
    LI.list_date,
    SUM(CASE WHEN PB.band = 1 THEN 1 ELSE 0 END) AS band_1_count,
    SUM(CASE WHEN PB.band = 2 THEN 1 ELSE 0 END) AS band_2_count,
    SUM(CASE WHEN PB.band = 3 THEN 1 ELSE 0 END) AS band_3_count,
    SUM(CASE WHEN PB.band = 4 THEN 1 ELSE 0 END) AS band_4_count
FROM
    List_Item LI
INNER JOIN Price_Band PB ON
    PB.low_price <= LI.price AND
    PR.high_price >= LI.price AND
    PB.band <= 4
WHERE
    LI.list_id = 1 AND
    LI.ranking <= 100 AND
GROUP BY
    LI.list_date
ORDER BY
    LI.list_date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...