我正在使用Java和SQL与Oracle数据库一起开发数据库项目。我是新工作的数据库和新的SQL。我的问题是:我如何能够获得客户数并在数据透视表上记录他们的每个购买历史记录?例如,在下表中,我总共有3次Lee,并且购买了项目A,项目B和项目C.安也有3次购买项目D,项目E和项目F.我想要在单独的数据透视表中输入他们的名字,出现次数和他们购买的东西。
Row Customer Purchase_History
1 Lee Item A
2 Lee Item B
3 Lee Item C
4 Ann Item D
5 Ann Item E
6 Ann Item F
我已经编写了一些试图执行此操作的代码,但是当我编译并运行时,它不会给我想要的结果。这是我的代码:
String TableCount = "SELECT J.Row, J.Customer, J.Purchase_History, C.cnt" +
" FROM Table J INNER JOIN(SELECT Customer, count(Customer) as cnt" +
"FROM Table GROUP BY Customer") C ON J.Customer = C.Customer;
ResultSet rs = st.executeQuery(TableCount);
while(rs.next()){
st.executeUpdate("CREATE TABLE IF NOT EXISTS CUSTOMER_COUNT" +
"(TableCount , Purchase_History )");
String InsertIntoTable = String.format("INSERT INTO CUSTOMER_COUNT" +
"("TableCount","Purchase_History")" +
" VALUES ('%s','%s)");
}
我在这里做错了什么?任何帮助将不胜感激!
答案 0 :(得分:0)
您的查询逻辑很好。您应该在运行之前打印出查询。问题是这两行(至少):
" FROM Table J INNER JOIN(SELECT Customer, count(Customer) as cnt" +
"FROM Table GROUP BY Customer") C ON J.Customer = C.Customer;
我认为你的意思是:
" FROM Table J INNER JOIN(SELECT Customer, count(Customer) as cnt" +
"FROM Table GROUP BY Customer) C ON J.Customer = C.Customer";
在任何情况下,当您打印出来时,您将使用表达式cntFROM table
。你需要一个空间:
" FROM Table J INNER JOIN(SELECT Customer, count(Customer) as cnt" +
" FROM Table GROUP BY Customer) C ON J.Customer = C.Customer";
但是,编写查询的更简单方法是使用分析函数:
select J.Row, J.Customer, J.Purchase_History,
count(*) over (partition by customer) as cnt
from table j