Sql server T-SQL GROUP BY ISSUE WITH CASE语句
我有一个带有CASE语句的查询,需要对别名执行GROUP BY。我知道这是不可能的,所以我尝试使用子查询,但它不起作用 以下是我正在处理的查询:Sql server T-SQL GROUP BY ISSUE WITH CASE语句,sql-server,tsql,Sql Server,Tsql,我有一个带有CASE语句的查询,需要对别名执行GROUP BY。我知道这是不可能的,所以我尝试使用子查询,但它不起作用 以下是我正在处理的查询: SELECT a.Vendor, a.Month_Sold --SUM(sd.SBQSHP) AS Sales_Qty, --SUM(sd.SBEPRC) AS Sales_Dlr FROM (SELECT sd.IFPRVN AS Vendor, vn.ACNAME AS Vendor_Name,
SELECT
a.Vendor,
a.Month_Sold
--SUM(sd.SBQSHP) AS Sales_Qty,
--SUM(sd.SBEPRC) AS Sales_Dlr
FROM
(SELECT
sd.IFPRVN AS Vendor,
vn.ACNAME AS Vendor_Name,
CASE
WHEN sd.SBINDT BETWEEN '2012-07-30' AND '2012-08-26' THEN 'August 2012'
WHEN sd.SBINDT BETWEEN '2012-08-27' AND '2012-09-30' THEN 'September 2012'
WHEN sd.SBINDT BETWEEN '2012-10-01' AND '2012-10-28' THEN 'October 2012'
WHEN sd.SBINDT BETWEEN '2012-10-29' AND '2012-11-25' THEN 'November 2012'
WHEN sd.SBINDT BETWEEN '2012-11-26' AND '2012-12-31' THEN 'December 2012'
WHEN sd.SBINDT BETWEEN '2013-01-01' AND '2013-01-27' THEN 'January 2013'
WHEN sd.SBINDT BETWEEN '2013-01-28' AND '2013-02-24' THEN 'Febuary 2013'
WHEN sd.SBINDT BETWEEN '2013-02-25' AND '2013-03-31' THEN 'March 2013'
END AS Month_Sold
FROM
dbo.SalesData sd
INNER JOIN dbo.S2K_VEND vn ON vn.ACVEND = sd.IFPRVN
WHERE
sd.SBINDT > '2012-07-29'
AND
sd.SBCLS IN ('1500')
AND
sd.SBDIV NOT IN ('4000')
)a
GROUP BY
a.Vendor,
a.Month_Sold
ORDER BY
a.Vendor,
a.Month_Sold
注释掉的两列需要以某种方式包括在内。有什么建议吗?真的,在日期输出上贴上漂亮的标签应该是演示层的工作。C等格式非常强大。除此之外,在最后一个可能的点之前,不要转换为漂亮的字符串标签,这将需要多一层:
SELECT
Vendor,
DATENAME(MONTH, Month_Sold) + ' ' + RTRIM(YEAR(Month_Sold)),
Sales_Qty,
Sales_Dlr
FROM
(
SELECT
Vendor,
Month_Sold,
SUM(SBQSHP) AS Sales_Qty,
SUM(SBEPRC) AS Sales_Dlr
FROM
(
SELECT
sd.IFPRVN AS Vendor,
vn.ACNAME AS Vendor_Name, -- why is this here?
CASE
WHEN sd.SBINDT BETWEEN '2012-07-30' AND '2012-08-26' THEN '2012-08-01'
WHEN sd.SBINDT BETWEEN '2012-08-27' AND '2012-09-30' THEN '2012-09-01'
...
WHEN sd.SBINDT BETWEEN '2013-01-28' AND '2013-02-24' THEN '2013-02-01'
WHEN sd.SBINDT BETWEEN '2013-02-25' AND '2013-03-31' THEN '2013-03-01'
END AS Month_Sold
FROM dbo.SalesData sd
INNER JOIN dbo.S2K_VEND vn
ON vn.ACVEND = sd.IFPRVN
WHERE sd.SBINDT > '2012-07-29'
AND sd.SBCLS IN ('1500')
AND sd.SBDIV NOT IN ('4000')
) AS a
GROUP BY Vendor, Month_Sold
) AS b
ORDER BY
Vendor,
Month_Sold;
只需选择需要在别名为a的子查询中聚合的值 向子查询添加select语句:
SELECT
sd.IFPRVN AS Vendor,
vn.ACNAME AS Vendor_Name,
sd.SBQSHP,
sd.SBEPRC
CASE
...
取消注释顶级select语句中的SUM语句,但将别名从sd更改为
SUM(a.SBQSHP) AS Sales_Qty,
SUM(a.SBEPRC) AS Sales_Dlr
首先,必须将字段sd.SBQSHP和sd.SBEPRC添加到子选择中。然后会引发什么错误?将字段添加到子选择后,将列上的别名更改为a以匹配子查询别名。这样做了。我不知道为什么我没有想到…谢谢!我还有一个问题。我如何根据月/年订单订购?也就是说,我希望结果数据的顺序与CASE语句中的顺序相同。8月、9月、10月等。为什么不能使用正确的日期/时间值,并在演示层添加8月等格式?