首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL中生成二维结果表

问在SQL中生成二维结果表
EN

Stack Overflow用户
提问于 2011-04-22 03:47:59
回答 3查看 1.6K关注 0票数 1

我有一个每天刷新的项目列表,其中每个项目都属于四个价格区间中的一个。

以下查询将按日期拉取每个价格区间中的商品计数,但它将每个区间/日期组合放入其自己的行中。

代码语言:javascript
复制
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

结果集如下所示(用于说明的两天时间):

代码语言:javascript
复制
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

虽然我可以通过迭代来创建我真正想要的表,但是有没有一种合理的方法来编写查询来以2-D形式返回数据,如下所示:

代码语言:javascript
复制
date        band1   band2   band2   band3   
2010-12-08  20      17      32      26
2010-12-09  19      16      33      27

谢谢大家。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-22 03:51:47

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2011-04-22 03:51:03

查看T-SQL中的PIVOT子句。=>MSDN Page

我不确定查询的确切形式,但它应该是这样的(如果可以工作,请告诉我):

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2011-04-22 03:57:09

首先,“”是列的可怕的日期名称,所以我希望这只是一个示例。其次,由于您没有对它使用别名,所以我不知道它实际在哪个表中,所以我最好的猜测是:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5749051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档