我有两张桌子。一个表看起来像
ORDER_ID | SHOPPER_NAME | DATE
-------------------------------
001A | Marianna | 08/09/2012
002A | Jason | 80/08/2012
和另一个包含订单信息的表
ORDER_ID | DATA_CODE | DATA_VALUE
----------------------------------
001A | MILK_MONEY | 1.20
001A | NUM_EGGS | 22
002A | TOTAL_SPENT | 32.43
001A | TOTAL_SPENT | 42.13
我需要获取特定订单的几个数据代码。如何在一行中选择SHOPPER_NAME,MILK_MONEY(DATA_VALUE,其中DATA_CODE ='MILK_MONEY'),TOTAL_SPENT和NUM_EGGS?我让它工作在我正在进行的3个连接,如
SELECT SHOPPER_NAME,
MILK.DATA_VALUE,
EGGS.DATA_VALUE,
TOTAL.DATA_VALUE
FROM GROCERIES G
JOIN ORDER_INFO MILK ON MILK.ORDER_ID=G.ORDER_ID
JOIN ORDER_INFO EGGS ON EGGS.ORDER_ID=G.ORDER_ID
JOIN ORDER_INFO TOTAL ON TOTAL.ORDER_ID=G.ORDER_ID
然而,这开始变得丑陋,并且在同一个表上进行多个连接感觉不对。有没有更有效的方法呢?
谢谢!
答案 0 :(得分:0)
SELECT SHOPPER_NAME,
(select sum(DATA_VALUE) from ORDER_INFO where DATA_CODE = 'MILK_MONEY' and ORDER_ID = G.ORDER_ID) as 'MilkValue'
(select sum(DATA_VALUE) from ORDER_INFO where DATA_CODE = 'NUM_EGGS' and ORDER_ID = G.ORDER_ID) as 'EggsValue'
(select sum(DATA_VALUE) from ORDER_INFO where DATA_CODE = 'TOTAL_SPENT' and ORDER_ID = G.ORDER_ID) as 'TotalSpentValue'
FROM GROCERIES G
使用subquerys
获取每笔金额(我不知道是否有更多的一列或者是否有牛奶,鸡蛋等的总数;在这种情况下,请删除sum's
)
每个总和将用于每个Order_Id
答案 1 :(得分:0)
您可以在第二个表上使用数据透视表对其进行非规范化,或者您可以通过对其进行非规范化来更改数据库体系结构。在堆栈溢出时查找MySQL PIVOT以获取更多示例,但是类似这样的内容:
SELECT * FROM
(SELECT ORDER_ID, DATA_CODE, DATA_VALUE FROM tablename
PIVOT (sum(DATA_VALUE) FOR DATA_CODE IN ([MILK_MONEY], [NUM_EGGS], [TOTAL_SPENT])) pvt
答案 2 :(得分:-1)
SELECT g.SHOPPER_NAME, oi.* from GROCERIES g JOIN ORDER_INFO oi on oi.ORDER_ID=G.ORDER_ID