【发布时间】:2014-04-22 13:39:54
【问题描述】:
想知道是否有人可以帮助我处理我试图用来从我的数据库中提取销售信息的查询。我正在尝试建立一个报告来按州显示所有销售额。我遇到过这段代码,虽然它接近我所需要的,但它并没有完全发挥作用。
除了每个州的销售额外,我还需要包括销售库存的仓库 (T1.[WhsCode])。我还需要对每一列求和(我知道您可以按 Ctrl 并单击以在每列底部获取总计,但希望它们自动出现在最终报告中)。有人可以帮忙吗?
这是目前的查询:
SELECT T0.State1 AS 'Bill-to State',
(
SELECT SUM(T1.DocTotal)
FROM OINV T1 WITH ( NOLOCK )
INNER JOIN OCRD T2 ON T2.CardCode = T1.CardCode
WHERE MONTH(T1.DOCDATE) = 1 AND
T2.State1 = T0.State1 AND
YEAR(T1.DOCDATE) = YEAR(GETDATE())
) AS 'JAN Amt',
(
SELECT SUM(T1.DocTotal)
FROM OINV T1 WITH ( NOLOCK )
INNER JOIN OCRD T2 ON T2.CardCode = T1.CardCode
WHERE MONTH(T1.DOCDATE) = 2 AND
T2.State1 = T0.State1 AND
YEAR(T1.DOCDATE) = YEAR(GETDATE())
) AS 'FEB Amt',
(
SELECT SUM(T1.DocTotal)
FROM OINV T1 WITH ( NOLOCK )
INNER JOIN OCRD T2 ON T2.CardCode = T1.CardCode
WHERE MONTH(T1.DOCDATE) = 3 AND
T2.State1 = T0.State1 AND
YEAR(T1.DOCDATE) = YEAR(GETDATE())
) AS 'MAR Amt',
(
SELECT SUM(T1.DocTotal)
FROM OINV T1 WITH ( NOLOCK )
INNER JOIN OCRD T2 ON T2.CardCode = T1.CardCode
WHERE MONTH(T1.DOCDATE) = 4 AND
T2.State1 = T0.State1 AND
YEAR(T1.DOCDATE) = YEAR(GETDATE())
) AS 'APR Amt',
(
SELECT SUM(T1.DocTotal)
FROM OINV T1 WITH ( NOLOCK )
INNER JOIN OCRD T2 ON T2.CardCode = T1.CardCode
WHERE MONTH(T1.DOCDATE) = 5 AND
T2.State1 = T0.State1 AND
YEAR(T1.DOCDATE) = YEAR(GETDATE())
) AS 'MAY Amt',
(
SELECT SUM(T1.DocTotal)
FROM OINV T1 WITH ( NOLOCK )
INNER JOIN OCRD T2 ON T2.CardCode = T1.CardCode
WHERE MONTH(T1.DOCDATE) = 6 AND
T2.State1 = T0.State1 AND
YEAR(T1.DOCDATE) = YEAR(GETDATE())
) AS 'JUN Amt',
(
SELECT SUM(T1.DocTotal)
FROM OINV T1 WITH ( NOLOCK )
INNER JOIN OCRD T2 ON T2.CardCode = T1.CardCode
WHERE MONTH(T1.DOCDATE) = 7 AND
T2.State1 = T0.State1 AND
YEAR(T1.DOCDATE) = YEAR(GETDATE())
) AS 'JUL Amt',
(
SELECT SUM(T1.DocTotal)
FROM OINV T1 WITH ( NOLOCK )
INNER JOIN OCRD T2 ON T2.CardCode = T1.CardCode
WHERE MONTH(T1.DOCDATE) = 8 AND
T2.State1 = T0.State1 AND
YEAR(T1.DOCDATE) = YEAR(GETDATE())
) AS 'AUG Amt',
(
SELECT SUM(T1.DocTotal)
FROM OINV T1 WITH ( NOLOCK )
INNER JOIN OCRD T2 ON T2.CardCode = T1.CardCode
WHERE MONTH(T1.DOCDATE) = 9 AND
T2.State1 = T0.State1 AND
YEAR(T1.DOCDATE) = YEAR(GETDATE())
) AS 'SEP Amt',
(
SELECT SUM(T1.DocTotal)
FROM OINV T1 WITH ( NOLOCK )
INNER JOIN OCRD T2 ON T2.CardCode = T1.CardCode
WHERE MONTH(T1.DOCDATE) = 10 AND
T2.State1 = T0.State1 AND
YEAR(T1.DOCDATE) = YEAR(GETDATE())
) AS 'OCT Amt',
(
SELECT SUM(T1.DocTotal)
FROM OINV T1 WITH ( NOLOCK )
INNER JOIN OCRD T2 ON T2.CardCode = T1.CardCode
WHERE MONTH(T1.DOCDATE) = 11 AND
T2.State1 = T0.State1 AND
YEAR(T1.DOCDATE) = YEAR(GETDATE())
) AS 'NOV Amt',
(
SELECT SUM(T1.DocTotal)
FROM OINV T1 WITH ( NOLOCK )
INNER JOIN OCRD T2 ON T2.CardCode = T1.CardCode
WHERE MONTH(T1.DOCDATE) = 12 AND
T2.State1 = T0.State1 AND
YEAR(T1.DOCDATE) = YEAR(GETDATE())
) AS 'DEC Amt'
FROM dbo.OCRD T0
LEFT JOIN dbo.OINV T1 ON T1.CardCode = T0.CardCode
GROUP BY T0.State1
ORDER BY T0.State1
【问题讨论】:
-
你应该发布一个 SQL Fiddle
-
12 次??还有其他方法可以做到这一点......
-
所以你想为每个状态结果记录添加一列,其中包含一个包含所有相关仓库代码的字符串?您能给我们提供有关表格中状态和卡代码的唯一性的信息吗?到目前为止,从 t1 到 t2 似乎存在一个 n:m 关系,从 t1 到 t0 存在另一个 n:m 关系。这是正确的吗?
-
您好,托尔斯滕。理想情况下,查询应该输出一个列,显示所有状态、一年中每个月的列以及销售来源的仓库(可能有几个)。状态是独一无二的,因为有 50 个都有单独的条目,即 AA、AK、AL、AR 等。不完全确定您在寻找卡码方面的内容。列出的所有客户都将仅是美国客户,并且都具有唯一的卡代码。就 n:m 而言是正确的。谢谢
-
对不起,我没有看到你的回复。我的问题是:T0 中的一个州有很多记录还是只有一个? T2 中的一个卡码有很多记录还是只有一个? T1 中的一个州有很多记录还是只有一个? T1 中的一个卡码有很多记录还是只有一个? T1 中的状态和卡片代码的一种组合有很多记录还是只有一个?
标签: sql sql-server sap