Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL多个子查询,无需分组依据_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL多个子查询,无需分组依据

SQL多个子查询,无需分组依据,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,基本上,我有一个相当复杂的查询,用来找出我们在工作中运行的数据库的一些情况 目标是显示我们使用的某些零件是否短缺,并显示这些零件。 它检查过去13周的使用情况,并预测未来3周的使用情况,以确定是否存在短缺 现在我遇到的问题是,我们有一个称为部件id的东西作为每个部件的唯一标识符,但是不同的部件id可以引用相同的部件。因此,我们必须检查part description字段,并通过group by语句匹配这些字段。一旦我这样做了,尽管我有一个问题,我在多个部件ID上有相同的部件,因为我使用了GROU

基本上,我有一个相当复杂的查询,用来找出我们在工作中运行的数据库的一些情况

目标是显示我们使用的某些零件是否短缺,并显示这些零件。 它检查过去13周的使用情况,并预测未来3周的使用情况,以确定是否存在短缺

现在我遇到的问题是,我们有一个称为部件id的东西作为每个部件的唯一标识符,但是不同的部件id可以引用相同的部件。因此,我们必须检查part description字段,并通过group by语句匹配这些字段。一旦我这样做了,尽管我有一个问题,我在多个部件ID上有相同的部件,因为我使用了GROUPBY语句,所以我只计算第一个部件

在分组之前,是否有方法将具有匹配描述的所有零件添加到一起

以下是查询:

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。