【发布时间】:2013-11-24 21:35:29
【问题描述】:
DBMS:德比
语言:Java
外部查询从内部查询中获取结果 它在特定日期内获得一种潜伏的销售额 但有时某种商品没有订单详情 潜台词。所以没有什么可加入的,我想看到一个“0” 对于这种情况。抱歉命名和缩进不好。 谢谢 杰克
SELECT s1.TextureName AS TYPE,
T.month AS MONTH,
NULLIF(sum(S.Sales),0) AS NS,
NULLIF(T.Total,0) AS total,
NULLIF(NULLIF(cast(S.Sales AS Float),0.0) / NULLIF(Cast(T.Total AS float),0.0) * 100.0,0.0) AS percent
FROM subtexture s1
LEFT JOIN
(SELECT s.SubTextureID,
sum(od.NetSales) AS Sales,
MONTH(o.PURCHASEDATETIME) AS MONTH
FROM subtexture s
LEFT JOIN products p ON (s.SubTextureID = p.SubTextureID)
LEFT JOIN order_details od ON (p.ProductCode = od.ProductCode)
LEFT JOIN orders o ON (od.OrderCode = o.OrderCode)
WHERE TRIM(CAST(CAST(YEAR(o.PurchaseDateTime) AS CHAR(4)) AS VARCHAR(4))) || '-' || TRIM(CAST(CAST(MONTH(o.PurchaseDateTime) AS CHAR(2)) AS VARCHAR(2))) = '2013-11'
GROUP BY s.SubTextureID,
MONTH(o.PurchaseDateTime)) AS S ON (S.SubTextureID = s1.SubTextureID) ,
(SELECT sum(od.NetSales) AS Total,
MONTH(o.PurchaseDateTime) AS MONTH
FROM orders o
LEFT JOIN order_details od ON (o.OrderCode = od.OrderCode)
WHERE TRIM(CAST(CAST(YEAR(o.PurchaseDateTime) AS CHAR(4)) AS VARCHAR(4))) || '-' ||TRIM(CAST(CAST(MONTH(o.PurchaseDateTime) AS CHAR(2)) AS VARCHAR(2))) = '2013-11'
GROUP BY MONTH(o.PURCHASEDATETIME)) AS T
WHERE T.MONTH = S.MONTH
GROUP BY s1.TextureName,
T.Total,
T.MONTH,
S.Sales
【问题讨论】:
-
简化您的问题并仅发布查询的相关部分。想一个更简单的例子来说明你的问题。
-
你为什么使用Java标签?我在问题中看不到任何与 Java 相关的部分。
-
对不起,我会尝试取消 Java 标记
-
好的。我正要写一个答案,但你的 SQL 要复杂得多,然后我首先想到了。你能再解释一下,SQL 做了什么,为什么你加入
order两次和subtexture两次?以及您尝试使用nullif实现的目标。我认为错误在nullif应该是coalsesce,但我也相信你在SQL中也有其他问题。 -
当我在这里的时候 :-) 说一个子纹理总是有一个产品是对的吗(不需要外连接)?产品不总是有订单(需要外连接)?一个订单总是至少有一个 order_detail(不需要外连接)?