SQL多个子查询,无需分组依据
基本上,我有一个相当复杂的查询,用来找出我们在工作中运行的数据库的一些情况 目标是显示我们使用的某些零件是否短缺,并显示这些零件。 它检查过去13周的使用情况,并预测未来3周的使用情况,以确定是否存在短缺 现在我遇到的问题是,我们有一个称为部件id的东西作为每个部件的唯一标识符,但是不同的部件id可以引用相同的部件。因此,我们必须检查part description字段,并通过group by语句匹配这些字段。一旦我这样做了,尽管我有一个问题,我在多个部件ID上有相同的部件,因为我使用了GROUPBY语句,所以我只计算第一个部件 在分组之前,是否有方法将具有匹配描述的所有零件添加到一起 以下是查询:SQL多个子查询,无需分组依据,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,基本上,我有一个相当复杂的查询,用来找出我们在工作中运行的数据库的一些情况 目标是显示我们使用的某些零件是否短缺,并显示这些零件。 它检查过去13周的使用情况,并预测未来3周的使用情况,以确定是否存在短缺 现在我遇到的问题是,我们有一个称为部件id的东西作为每个部件的唯一标识符,但是不同的部件id可以引用相同的部件。因此,我们必须检查part description字段,并通过group by语句匹配这些字段。一旦我这样做了,尽管我有一个问题,我在多个部件ID上有相同的部件,因为我使用了GROU
SELECT
st.[Commodity] AS 'Commodity'
,st.[Description] AS 'Description'
,st.[Good] AS 'Good'
,st.[3 week demand] AS '3 week demand'
,CASE
WHEN ROUND(CONVERT(FLOAT,st.[Shortage]),0) BETWEEN 0 AND 1
THEN '-1'
ELSE ROUND(CONVERT(FLOAT,st.[Shortage]),0) END AS 'Shortage'
FROM
(
SELECT
tt.[Commodity]
,tt.[Description]
,SUM(tt.[Good]) AS 'Good'
,ROUND(CONVERT(FLOAT,SUM((tt.[Usage last 13 weeks] / 13) * 3)),1) AS '3 week demand'
,CASE
WHEN SUM(tt.[Usage last 13 weeks]) > 0
THEN SUM(
(tt.[Good] - (tt.[Usage last 13 weeks] / 13) * 3)
)
ELSE ISNULL(SUM(
(
(tt.[Good] - (tt.[Usage last 13 weeks] / 13) * 3)
)
),0)
END AS 'Shortage'
FROM
(
SELECT
pa.id AS 'ID'
,pa.category AS 'Commodity'
,pa.[description] AS 'Description'
,'Usage last 13 weeks' =
(
SELECT
ROUND(CONVERT(FLOAT,COUNT(*)),1)
FROM
tbl_component AS co
WHERE
co.date_out > (DATEADD(WEEK,-13,GETDATE()))
AND workorder_out_id IS NOT NULL
AND co.id IN (SELECT component_id FROM tbl_repairlines WHERE component_id IS NOT NULL)
AND co.customer_id IS NULL
AND co.part_id = pa.id
)
,'Good' =
(
SELECT
ROUND(CONVERT(FLOAT,COUNT(*)),1)
FROM
tbl_component AS co2
,tbl_loc_com_latest AS ll
WHERE date_out IS NULL
AND co2.id = ll.component_id
AND co2.location_id = 26
AND UPPER(ll.system_comment) NOT LIKE 'BJ%'
AND co2.part_id = pa.id
AND co2.[status] = 'GOOD'
)
FROM
tbl_component AS co
,tbl_parts AS pa
WHERE
pa.id = co.part_id
AND ((co.id IN (SELECT component_id FROM tbl_repairlines WHERE component_id IS NOT NULL)) OR (pa.category = 'TAPE'))
AND ((workorder_out_id IS NOT NULL) OR (pa.category = 'TAPE'))
AND customer_id IS NULL
AND pa.category IN ('HEAD')
GROUP BY
pa.id
,pa.category
,pa.[description]
) AS tt
GROUP BY
tt.[Description]
,tt.[Commodity]
) AS st
GROUP BY
st.[Commodity]
,st.[Description]
,st.[Good]
,st.[3 week demand]
,st.[Shortage]
HAVING
st.[Shortage] < 0
ORDER BY
'Shortage' ASC
没有一些ddl和样本数据,很难确定我们编写的任何内容是否准确。此外,有太多的子选择有太多的机会破译这一点。我建议您切换到使用ANSI-92样式的联接,而不是在where子句中包含联接条件的旧样式。如果这是我的系统,我会从头开始,这样您就可以使这个查询更快、可扩展和可维护。我可以帮助您开始,但不能没有一些表定义和示例数据。谢谢。因为我自己还没有写过这个查询,而且我自己还处于学习SQL的阶段,所以对我来说也很难。我会用一些表格的意思更新这个问题。你可以使用sqlfiddle.com来帮助我。要么这样,要么更新你的问题。我指的不是表的文本描述,而是CREATETABLE脚本和insert语句。这是一个非常复杂的查询。我在这里数了五个独特的select语句。我怀疑当一切都说了,做了,两个CTE会使这更容易处理。不知道sqlfiddle的存在。我将处理一些示例表,在那里我可以复制问题并报告!因此,实际上零件id不是唯一的键,而是描述。因此,为什么不尝试通过删除对part id的所有引用来实现此查询,然后在运行时,如果需要,添加maxpart id或使用用户定义的聚合函数来报告每行的所有part id。