Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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_Select_Correlated Subquery - Fatal编程技术网

Sql 使用相关子查询和多个表进行选择

Sql 使用相关子查询和多个表进行选择,sql,sql-server,select,correlated-subquery,Sql,Sql Server,Select,Correlated Subquery,我有两张桌子(表1和表2)。其中包括一个日期(tDate)列和一个ID(tTillNo)列,我想根据它们进行分组。另一个是我想为每个日期和ID求和的值(pValue) 可以使用每个表中的“tName”和“pName”列联接这些表,但是pName列可能有重复项,我希望将其包含在总和中。 对于3个子查询,我还需要使用“pCode”列包含where子句 我想返回这里显示的列 但是,使用下面的代码返回总计不正确的子查询,因为我使用“MAX(a.tName)”来阻止对该字段进行分组。有没有人能提出另一种

我有两张桌子(表1和表2)。其中包括一个日期(tDate)列和一个ID(tTillNo)列,我想根据它们进行分组。另一个是我想为每个日期和ID求和的值(pValue)

可以使用每个表中的“tName”和“pName”列联接这些表,但是pName列可能有重复项,我希望将其包含在总和中。 对于3个子查询,我还需要使用“pCode”列包含where子句

我想返回这里显示的列

但是,使用下面的代码返回总计不正确的子查询,因为我使用“MAX(a.tName)”来阻止对该字段进行分组。有没有人能提出另一种方法来防止这种情况发生,或者提出另一种方法来处理这个问题

SELECT 
    DATENAME(Month,a.tDate) as 'Month Name', DAY(a.tDate) as 'Day', 
    MONTH(a.tDate) as 'Month', YEAR(a.tDate) as 'Year', a.tTillNo,

    BankedCash=(SELECT ISNULL(CAST(SUM(b.pValue) as numeric(12,2)),0) 
               FROM Table2 b 
                    where MAX(a.tName)=b.pName AND pCode = 'CSH' 
                    or pCode = 'CHQ'),

    CardTransactions=(SELECT ISNULL(CAST(SUM(b.pValue) as numeric(12,2)),0) 
                     FROM Table2 b 
                          where MAX(a.tName)=b.pName AND b.pCode = 'CRD'),

    BankingTotal=(SELECT ISNULL(CAST(SUM(b.pValue) as numeric(12,2)),0) 
                 FROM Table2 b 
                      where MAX(a.tName)=b.pName AND b.pCode = 'CSH' or 
                      b.pCode = 'CHQ' or b.pCode = 'CRD')

FROM Table1 a

group by YEAR(a.tDate), MONTH (a.tDate), DATENAME(Month,a.tDate), 
DAY(a.tDate), a.tTillNo

order by YEAR(a.tDate), MONTH (a.tDate), DATENAME(Month,a.tDate)
如有任何建议或文章推荐,将不胜感激。非常感谢

CREATE TABLE [dbo].[Table1](
[UniqueID] [int] IDENTITY(1,1) NOT NULL,
[tTillNo] [varchar](4) NULL,
[tName] [varchar](20) NULL,
[tDate] [datetime] NULL)

INSERT INTO Table1 (tTillNo, tName, tDate)
VALUES ('0101', '01010000001', '2018-10-30 00:00:00.000'),
       ('0101', '01010000002', '2018-10-30 00:00:00.000'),
       ('0102', '01020000001', '2018-10-30 00:00:00.000'),
       ('0102', '01020000002', '2018-10-30 00:00:00.000')

CREATE TABLE [dbo].[Table2](
[UniqueID] [int] IDENTITY(1,1) NOT NULL,
[pName] [varchar](20) NULL,
[pCode] [varchar](10) NULL,
[pValue] [decimal](22, 7) NULL)


INSERT INTO Table2 (pName, pCode, pValue)
VALUES ('01010000001', 'CRD', '100.0000000'),
       ('01010000002', 'CSH', '100.0000000'),
       ('01020000001', 'CHQ', '100.0000000'),
       ('01020000002', 'CSH', '100.0000000'),
       ('01020000002', 'CRD', '100.0000000'),
       ('01010000001', 'CSH', '100.0000000')

我想你可以通过连接解决这一切

select DATENAME(Month,a.tDate) as 'Month Name'
   , DAY(a.tDate) as 'Day'
   , MONTH(a.tDate) as 'Month'
   , YEAR(a.tDate) as 'Year'
   , a.tTillNo
   , BankedCash=SUM(case when pCode in( 'CSH','CHQ') then pvalue else 0 end)
   , [Card] = SUM(case when pCode in( 'CRD') then pvalue else 0 end)
   ,Total = SUM(pvalue)
from TableA a
    join TableB b on a.tName=b.pName
group by YEAR(a.tDate)
    , MONTH (a.tDate)
    , DATENAME(Month,a.tDate)
    , DAY(a.tDate)
    , a.tTillNo

我想你可以通过连接解决这一切

select DATENAME(Month,a.tDate) as 'Month Name'
   , DAY(a.tDate) as 'Day'
   , MONTH(a.tDate) as 'Month'
   , YEAR(a.tDate) as 'Year'
   , a.tTillNo
   , BankedCash=SUM(case when pCode in( 'CSH','CHQ') then pvalue else 0 end)
   , [Card] = SUM(case when pCode in( 'CRD') then pvalue else 0 end)
   ,Total = SUM(pvalue)
from TableA a
    join TableB b on a.tName=b.pName
group by YEAR(a.tDate)
    , MONTH (a.tDate)
    , DATENAME(Month,a.tDate)
    , DAY(a.tDate)
    , a.tTillNo

你能提供格式数据而不是图像吗?因为大多数人喜欢使用格式数据而不是图像:)以
文本
的形式提供示例数据,理想的形式是DDL(
CREATE
)和DLM(
INSERT
)语句。您已将预期输出作为映像提供给我们,但我们无法运行您的SQL,我们无法访问您的数据,因此我们很难尝试帮助您。您能提供格式数据而不是映像吗?因为大多数人喜欢使用格式数据而不是图像:)以
文本
的形式提供示例数据,理想的形式是DDL(
CREATE
)和DLM(
INSERT
)语句。你已经给了我们你的预期输出,作为一个映像,但我们无法运行你的SQL,我们无法访问你的数据,因此我们很难尝试帮助你。这正是我需要的,完美基思。这正是我需要的,完美基思。