Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 2012_Count - Fatal编程技术网

Sql 两个独立的查询;一个需要从另一个数行

Sql 两个独立的查询;一个需要从另一个数行,sql,sql-server,sql-server-2012,count,Sql,Sql Server,Sql Server 2012,Count,我有两个不同的问题。一个用于详细信息文件,另一个用于结束/结束文件(我也有一个头文件,但该头文件与此问题无关)。我将不得不保持这些单独的,因为它们将返回不同的列 问题是我的详细信息文件有13470行,但当我在二次查询(拖车文件)中进行计数时,我得到13207行。原因是少数项目具有多个与主项目ID关联的辅助ID 如果不使用选择DISTINCT,我可以得到相同的计数,但它会返回25250行。我需要在我的详细资料文件中保留副本 详细信息查询相当长,但请理解,尽管几乎所有记录都是唯一的,但在某些情况下,

我有两个不同的问题。一个用于详细信息文件,另一个用于结束/结束文件(我也有一个头文件,但该头文件与此问题无关)。我将不得不保持这些单独的,因为它们将返回不同的列

问题是我的详细信息文件有13470行,但当我在二次查询(拖车文件)中进行计数时,我得到13207行。原因是少数项目具有多个与主项目ID关联的辅助ID

如果不使用
选择DISTINCT
,我可以得到相同的计数,但它会返回25250行。我需要在我的详细资料文件中保留副本

详细信息查询相当长,但请理解,尽管几乎所有记录都是唯一的,但在某些情况下,主项ID似乎是重复的,只是因为辅助项ID的主项ID可能有几个不同的值

我读过下面的文章,但似乎一篇也没用。请注意,我使用的是Microsoft SQL Server 2012,而不是MySQL,但我确实将MySQL的概念应用到了我的需求中,其中一篇文章对此进行了解释:

同样,我希望根据我在详细信息文件中指定的所有条件(几十列和13470行)得到一个计数。我的拖车文件只有两列和一行。一个用于标识结束/结束文件,另一个用于显示应由详细信息文件返回的记录数

下面是我的“试着看看这是否有效或是否在正确的路径上”查询(但它没有):

这将返回25250行

当然,
CASE
语句是错误的,但我只是想把它作为一个选项来探讨。有人知道我如何让我的查询同步吗

再次:

  • Microsoft SQL Server 2012
  • 1头文件(works)
  • 1详细资料文件(工程)
  • 1个拖车文件(未按预期工作)
使用
案例的拖车结果
语句:

  | RECID | TOTREC |
--------------------
1 | TRL   | 25250  |
拖车结果仅在其中一列上计数
DISTINCT

  | RECID | TOTREC |
--------------------
1 | TRL   | 13207  |
寻找:

  | RECID | TOTREC |
--------------------
1 | TRL   | 13470  |
如有任何建议,将不胜感激。谢谢

编辑

这里是详细文件查询,但我删除了不相关的列;我执行了此查询,其工作原理与未编辑的查询相同,因此这应该足以说明:

SELECT DISTINCT
    RTRIM(CAST('DTL' AS VARCHAR(3))) AS RECID,
    RTRIM(CAST('12345' AS VARCHAR(10))) AS COMPANY,
    RTRIM(CAST(CASE 
                WHEN I2.VNDITNUM = ''
                THEN 'BLANK'
                ELSE I2.VNDITNUM END AS VARCHAR(20))) AS VNDITEM,
    RTRIM(CAST(I.ITEMNMBR AS VARCHAR(20))) AS NUMITEM,
    RTRIM(CAST(I.ITEMDESC AS VARCHAR(60))) AS ITMDESC,
    RTRIM(CAST(CASE 
          WHEN I.INACTIVE = '0' 
          THEN 'A' 
          WHEN I.INACTIVE = '1' 
          THEN 'I' END AS VARCHAR(1))) AS STATUS
FROM Inv00101 I
JOIN Inv00102 I2 ON I2.ITEMNMBR = I.ITEMNMBR
JOIN ItemUnit I3 ON I3.ITEMNMBR = I.ITEMNMBR
LEFT OUTER JOIN prodmaster D ON D.itemid = I.ITEMNMBR
LEFT OUTER JOIN productinfo I4 ON I4.ITEMNMBR = I.ITEMNMBR
WHERE (ITMDESC LIKE '%ART%' OR ITMDESC LIKE '%CRAFT%')
请注意,
ITEMNMBR
是主要的内部ID,而
VNDITNUM
是供应商/供应商ID,我称之为次要ID。对于产品的唯一主要内部ID,
VNDITNUM
有时有多条记录

正常结果如下:

  | RECID | COMPANY | VNDITEM | NUMITEM | ITMDESC | STATUS |
------------------------------------------------------------
1 | DTL   | 12345   | 011223  | 100234  | Game    | A      |
2 | DTL   | 12345   | 015992  | 104722  | Picture | A      |
但以下是一个可能重复的示例:

  | RECID | COMPANY | VNDITEM | NUMITEM | ITMDESC | STATUS |
------------------------------------------------------------
1 | DTL   | 12345   | 029445  | 109777  | Book A  | A      |
2 | DTL   | 12345   | 029478  | 109777  | Book A  | A      |

如果您的“拖车”查询只返回1条记录。。。然后您可以尝试使用tsql函数
@@recordcount

像这样:

-- Declare an integer variable
DECLARE @rc as integer;

-- Your Detail query
SELECT
   IDont
   ,CareWhat
   ,TheDetailLogicIs
FROM
   Inv00101 as i
   JOIN WhoKnowsWhat as idk ON i.ITEMNMBR = idk.ITEMNMBR
WHERE 
   Who = Cares;

-- Assign your row count variable with the row count of the last executed query.
SET @rc = @@rowcount;

-- Your new Trailer query
SELECT
   'TRL' AS [RECID]
   ,@rc AS [TOTREC];
这样做的另一个好处是,您可以获得感兴趣的实际查询的行数。另外,您不必执行重复的逻辑,这可能会很耗时(特别是当您的详细信息查询像您想象的那样复杂时)


希望有帮助:)

如果您的“拖车”查询只返回1条记录。。。然后您可以尝试使用tsql函数
@@recordcount

像这样:

-- Declare an integer variable
DECLARE @rc as integer;

-- Your Detail query
SELECT
   IDont
   ,CareWhat
   ,TheDetailLogicIs
FROM
   Inv00101 as i
   JOIN WhoKnowsWhat as idk ON i.ITEMNMBR = idk.ITEMNMBR
WHERE 
   Who = Cares;

-- Assign your row count variable with the row count of the last executed query.
SET @rc = @@rowcount;

-- Your new Trailer query
SELECT
   'TRL' AS [RECID]
   ,@rc AS [TOTREC];
这样做的另一个好处是,您可以获得感兴趣的实际查询的行数。另外,您不必执行重复的逻辑,这可能会很耗时(特别是当您的详细信息查询像您想象的那样复杂时)


希望有帮助:)

我找到了一种使用派生表来实现这一点的方法,这样我仍然可以保持查询的独立性,并使用SSI来填充单独的平面文件(如果一个查询有多个select语句,而没有
UNION
s,则无法做到这一点)。谢谢大家帮我到达那里!非常感谢你的建议

以下是我使用的:

SELECT 
    CAST('TRL' AS VARCHAR(3)) AS RECID,
    COUNT(TotalRows) AS TOTREC 
FROM (SELECT DISTINCT
    RTRIM(CAST(CASE 
            WHEN I2.VNDITNUM = ''
            THEN 'BLANK'
            ELSE I2.VNDITNUM END AS VARCHAR(20))) AS VNDITEM,
    RTRIM(CAST(I.ITEMNMBR AS VARCHAR(20))) AS NUMITEM,
    @@ROWCOUNT AS TotalRows,
    I.ITMDESC
    FROM Inv00101 I
    JOIN Inv00102 I2 ON I2.ITEMNMBR = I.ITEMNMBR
    JOIN ItemUnit I3 ON I3.ITEMNMBR = I.ITEMNMBR
    LEFT OUTER JOIN prodmaster D ON D.itemid = I.ITEMNMBR
    LEFT OUTER JOIN productinfo I4 ON I4.ITEMNMBR = I.ITEMNMBR
    WHERE (ITMDESC LIKE '%ART%' OR ITMDESC LIKE '%CRAFT%')

我找到了一种使用派生表来实现这一点的方法,这样我仍然可以将查询分开,并使用SSI来填充单独的平面文件(如果一个查询有多个select语句而没有
UNION
s,则无法做到这一点)。谢谢大家帮我到达那里!非常感谢你的建议

以下是我使用的:

SELECT 
    CAST('TRL' AS VARCHAR(3)) AS RECID,
    COUNT(TotalRows) AS TOTREC 
FROM (SELECT DISTINCT
    RTRIM(CAST(CASE 
            WHEN I2.VNDITNUM = ''
            THEN 'BLANK'
            ELSE I2.VNDITNUM END AS VARCHAR(20))) AS VNDITEM,
    RTRIM(CAST(I.ITEMNMBR AS VARCHAR(20))) AS NUMITEM,
    @@ROWCOUNT AS TotalRows,
    I.ITMDESC
    FROM Inv00101 I
    JOIN Inv00102 I2 ON I2.ITEMNMBR = I.ITEMNMBR
    JOIN ItemUnit I3 ON I3.ITEMNMBR = I.ITEMNMBR
    LEFT OUTER JOIN prodmaster D ON D.itemid = I.ITEMNMBR
    LEFT OUTER JOIN productinfo I4 ON I4.ITEMNMBR = I.ITEMNMBR
    WHERE (ITMDESC LIKE '%ART%' OR ITMDESC LIKE '%CRAFT%')

您是否正在根据这些查询创建实际文件?或者只是结果集。@jderekc:你自己回答了这个问题。您说您在“详细信息”查询中使用了
次要ID
,但在“拖车”查询中没有使用它。如果
次要ID
是“详细信息”查询选择条件的一部分,那么从逻辑上讲,您需要在“拖车”查询中使用
次要ID
来获得相同的计数。您可以做的第二件事是:如果“拖车”查询始终只返回1条记录,您可以在“详细信息”查询之后立即使用tsql函数
@@rowcount
。然后,您可以将实际的行数放入“拖车”中。您需要声明一个整数变量,如:
将@rc声明为整数
然后在“详细信息”查询之后,为@rc分配行数:
设置@rc=@@rowcount
然后在尾部查询中,您可以在需要行计数的位置使用@rc变量。这些查询结果集将导出到唯一的文件中。另外,如果您查看我的案例陈述,我试图包括两个ID进行比较,但我的逻辑不正确。@jderekc:您可能需要向我们显示您的“详细”查询,以便我们可以查看您的
主ID
辅助ID
的实际使用情况。如果您的“拖车”查询正在删除您的
次要ID
记录,那么您的逻辑问题就在那里。您是否正在从这些查询创建实际文件?或者只是结果集。@jderekc:你回答了问题