【问题标题】:SQL Unique Values Numbering Sequence for Pivot数据透视的 SQL 唯一值编号顺序
【发布时间】:2010-11-09 19:15:56
【问题描述】:

为了报告目的,我需要透视每条记录上唯一的查询结果。我目前的说法是:

SELECT *
FROM Sales AS x
WHERE (select count(*) from Sales where customer_name=x.customer_name 
        and order_date>=x.order_date)<=5
ORDER BY customer_name, order_date, price;

查询输出的示例是:

customer_name    order_date        price
Company A        2009-02-01        800 
Company A        2009-03-01        100
Company A        2009-04-01        200
Company A        2009-05-01        300
Company A        2009-06-01        500
Company B        2009-02-01        100
Company B        2009-02-01        800
Company B        2009-04-01        200
Company B        2009-05-01        300
Company B        2009-06-01        500

最终,信息需要如下所示:

Customer_Name     order_date1  price1    order_date2  price2    order_date3  price3    order_date4  price4    order_date5  price5   
Company A         2009-02-01   800       2009-03-01   100       2009-04-01   200       2009-05-01   300       2009-06-01   500
Company B         2009-02-01   100       2009-02-01   800       2009-04-01   200       2009-05-01   300       2009-06-01   500

我在想我需要为“pivot_id”添加一列,以便每个分组都有一个公共记录,因此在数据透视之前的查询结果将如下所示:

pivot_id  customer_name    order_date        price
1         Company A        2009-02-01        800 
2         Company A        2009-03-01        100
3         Company A        2009-04-01        200
4         Company A        2009-05-01        300
5         Company A        2009-06-01        500
1         Company B        2009-02-01        100
2         Company B        2009-02-01        800
3         Company B        2009-04-01        200
4         Company B        2009-05-01        300
5         Company B        2009-06-01        500

什么 SQL 语句会为每次购买生成一个自动记录号,而且还会从每个 customer_name 重新开始??

使用 SQL 代码生成器在 Access 2007 中工作。如果解决方案与 Access 兼容,那就太好了。

抱歉,篇幅较长。提前致谢。

【问题讨论】:

    标签: sql ms-access pivot crosstab


    【解决方案1】:

    另一个相关子查询怎么样?保存你的查询,比如 Query1(你可能想从这个中间查询中删除 ORDER BY 子句——只需要对最终结果集进行排序):

    SELECT Q1.customer_name, Q1.order_date, Q1.price, 
           (
            SELECT COUNT(*) + 1
              FROM MyQuery AS Q2
             WHERE Q2.customer_name = Q1.customer_name
                   AND Q2.order_date < Q1.order_date
           ) AS pivot_id
      FROM MyQuery AS Q1;
    

    【讨论】:

    • 几个问题:-非常慢。 - 将相同的编号分配给任何具有相同价格的订单,这种情况经常发生。查看上面的数据集示例,B 公司在 2009 年 2 月 1 日进行了两次购买,两次购买都分配了 1 的 pivot_id。经过一些修改,仍然很慢,但是可以!谢谢!
    • 是的,Access 数据库引擎没有针对相关子查询进行很好的优化 :( 考虑使用 TOP 5 重写您的原始查询以消除 that 相关子查询。跨度>
    猜你喜欢
    • 2021-10-27
    • 2016-12-06
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    相关资源
    最近更新 更多