Sql server SQL Server中的诱惑

Sql server SQL Server中的诱惑,sql-server,Sql Server,问题#1: 输出: Vendor Date of Last Check Date of check for month Amount ----------------------------------------------------------------------------- Boston Warehouse 12/12/2017 12/12/2017 919.00 Woodli

问题#1:

输出:

Vendor              Date of Last Check   Date of check for month       Amount
-----------------------------------------------------------------------------
Boston Warehouse    12/12/2017            12/12/2017                   919.00
Woodlink            12/12/2017            12/12/2017                   979.86
问题2:

产出2:

Sales Rep       Commission $ paid
---------------------------------
Tammy Hanson    379.77
最后查询:

select * 
from #TempTable1, #TempTable2  
最终输出:

Vendor      DateofLastCheck Dateofcheckformonth Amount  Sales Rep      Commpaid
Boston 
Warehouse   12/12/2017     12/12/2017          919.00   Tammy Hanson    379.77
Woodlink    12/12/2017     12/12/2017          979.86   Tammy Hanson    379.77
输出2显示Tammy Hanson只支付了一笔379.77的佣金。但在最终输出中显示了支付379.77佣金的两倍。如何纠正这个问题?
如何在最终输出中仅显示一个支付的佣金?请,任何一个都可以帮助我。

您得到的是重复的值,因为您使用的是交叉联接(笛卡尔积)。请至少指定一个条件以匹配两个表中的记录,以便仅针对所需记录显示值

根据您当前的查询,它将返回两个表中所有可能的行组合。像这样改变它

select * from #TempTable1 T1,#TempTable2  T2 WHERE T1.ColumnName = T2.ColumnName
或者你也可以说

select * from #TempTable1 T1
inner join #TempTable2  T2 
WHERE T1.ColumnName = T2.ColumnName
--如果您想要两个表上都有匹配项的记录


--如果您需要来自#试探性1的记录,并且如果没有匹配的记录,则试探性2的记录显示为空

,您似乎只需执行一次查询。较大的查询在group by子句中已经有[sales rep],那么为什么不将佣金相加呢

SELECT
      a.* INTO #TempTable1
FROM (
      SELECT
            Vendor
          , CASE WHEN CONVERT(varchar(50), DateModified, 101) = '01/01/1900' THEN '' ELSE CONVERT(varchar(50), DateModified, 101) END
            AS 'Date of Last Check'
          , CASE WHEN CONVERT(varchar(50), PaycommissionDate, 101) = '01/01/1900' THEN '' ELSE CONVERT(varchar(50), PaycommissionDate, 101) END
            AS 'Date of check for month'
          , SUM([Original $ Total]) 'Amount'
          , [Sales Rep]
          , SUM([Commission $ paid]) 'Commission $ paid'
      FROM Tbl_Commission_Reconcilation
      WHERE Vendor IS NOT NULL
      AND MONTH([Order Date]) = MONTH(GETDATE())
      GROUP BY
            Tbl_Commission_Reconcilation.Vendor
          , CONVERT(varchar(50), DateModified, 101)
          , [Sales Rep]
          , PaycommissionDate
) a

您还应该在查询中添加行号

表1

SELECT a.*  
INTO #TempTable1 
FROM
    (SELECT 
         Vendor,
         CASE WHEN CONVERT(varchar(50), DateModified, 101)='01/01/1900' THEN '' ELSE CONVERT(varchar(50), DateModified, 101) END AS 'Date of Last Check', 
         CASE WHEN CONVERT(varchar(50), PaycommissionDate, 101)='01/01/1900' THEN '' ELSE CONVERT(varchar(50), PaycommissionDate, 101) END AS 'Date of check for month',
         SUM([Original $ Total]) 'Amount',
         ROW_NUMBER() OVER(ORDER BY Vendor, DateModified, [Sales Rep]) RN
     FROM
         Tbl_Commission_Reconcilation  
     WHERE
         Vendor IS NOT NULL
         AND MONTH([Order Date]) = MONTH (GETDATE())
     GROUP BY
         Tbl_Commission_Reconcilation.Vendor,
         CONVERT(varchar(50), DateModified, 101),
         [Sales Rep], PaycommissionDate) a
表2

SELECT b.*  INTO #TempTable2  
    from
    (SELECT [Sales Rep],SUM([Commission $ paid]) 'Commission $ paid',
        ROW_NUMBER() OVER(ORDER BY [Sales Rep]) RN
    from Tbl_Commission_Reconcilation  where Vendor is not null and Month([Order Date])= MONTH (Getdate())
    group by [Sales Rep])b
并将table1和table2与这个RN列左连接

select 
  *
from #TempTable1 t1
    LEFT JOIN #TempTable2 t2
ON t1.RN = t2.RN 

这两个输出是如何关联的?我在这里没有看到亲戚在ANSI-92 SQL标准(25年前)中,用正确的ANSI
JOIN
语法替换了老式的逗号分隔表列表样式它的用途是De劝阻DevordVendor最后一次检查日期每月金额的检查日期供应商销售代表佣金$paid Boston Warehouse 12/12/2017 12/12/12 919.00 Boston Warehouse Tammy Hanson 183.80 Woodlink 12/12/2017 12 979.86 Woodlink Tammy Hanson 195.97它显示了Tammy Hanson的2倍。但我只想显示一个Tammy Hanson和sumof佣金已付。有可能吗?但我还是得到了相同的结果。供应商最后一次检查日期月金额检查日期销售代表佣金已付波士顿仓库2017年12月12日2017年12月919.00 Tammy Hanson 183.80 Woodlink 2017年12月12日2017年12月979.86 Tammy Hanson 195.97Super,非常好。非常感谢。现在它开始工作了。非常感谢。根据您的查询,我得到了以下提到的输出:波士顿仓库2017年12月12日2017年12月12日919.00塔米汉森183.80伍德林克2017年12月12日2017年12月12日979.86塔米汉森195.97它显示了塔米汉森的两倍。但我只想显示一份塔米汉森和萨莫夫佣金。是吗可能吗?但是佣金与“那一行”有关,即使销售代表被重复
SELECT a.*  
INTO #TempTable1 
FROM
    (SELECT 
         Vendor,
         CASE WHEN CONVERT(varchar(50), DateModified, 101)='01/01/1900' THEN '' ELSE CONVERT(varchar(50), DateModified, 101) END AS 'Date of Last Check', 
         CASE WHEN CONVERT(varchar(50), PaycommissionDate, 101)='01/01/1900' THEN '' ELSE CONVERT(varchar(50), PaycommissionDate, 101) END AS 'Date of check for month',
         SUM([Original $ Total]) 'Amount',
         ROW_NUMBER() OVER(ORDER BY Vendor, DateModified, [Sales Rep]) RN
     FROM
         Tbl_Commission_Reconcilation  
     WHERE
         Vendor IS NOT NULL
         AND MONTH([Order Date]) = MONTH (GETDATE())
     GROUP BY
         Tbl_Commission_Reconcilation.Vendor,
         CONVERT(varchar(50), DateModified, 101),
         [Sales Rep], PaycommissionDate) a
SELECT b.*  INTO #TempTable2  
    from
    (SELECT [Sales Rep],SUM([Commission $ paid]) 'Commission $ paid',
        ROW_NUMBER() OVER(ORDER BY [Sales Rep]) RN
    from Tbl_Commission_Reconcilation  where Vendor is not null and Month([Order Date])= MONTH (Getdate())
    group by [Sales Rep])b
select 
  *
from #TempTable1 t1
    LEFT JOIN #TempTable2 t2
ON t1.RN = t2.RN