Select 来自一个 table 的数据基于 SQL 中另一个 table 的选择

Select data from one table base on selection from another table in SQL

我有这3个table

首先包含给定日期价格的商品

第二个是 table 项

第 3 个是第 table 个日期,我们要在其中每个日期显示第 2 个 table 商品的价格

如果第一个时长不可用 table 它应该是 0

with myTable ( item,startdate,enddate,price) as 
(  
  select  'AAAA' ,'16-3-2020','19-3-2020','50' union all
  select  'AAAA' ,'16-4-2020','19-4-2020','70' union all
  select  'BBB' ,'16-3-2020','19-3-2020','20' union all
  select  'BBB' ,'16-4-2020','19-4-2020','90' union all
  select  'CCC' ,'16-3-2020','29-3-2020','45' union all
  select  'CCC' ,'16-4-2020','19-4-2020','120'
)
select  item,startdate,enddate,price  from myTable
GO

with itemTable ( item) as 
(  
  select  'AAAA'  union all
  select  'BBB'  union all
   select  'CCC' 
)
select  item  from itemTable

GO

with DateTable ( dateItem) as 
(  
  select  '16-3-2020'  union all
  select  '19-4-2020'  union all
  select  '20-3-2020' 
)
select  dateItem  from DateTable

GO

而我想要的结果应该是这样的(以上是动态数据)

with mydesireTable (item, [16-3-2020],[19-4-2020],[20-3-2020]) as 
(  
  select  'AAAA' ,'50','70','0' union all ---0 as its not on above  data in duration 
  select  'BBB' ,'20','90','0' union all
  select  'CCC' ,'45','120','45' 
)
select  item, [16-3-2020],[19-4-2020],[20-3-2020]  from mydesireTable

我不确定要搜索什么 :) 因为我想为其编写查询 return 我希望 table 作为数据(或临时 table )

执行此操作的多种方法之一。这是一个 static 交叉表。您需要明确列出所有列(两次)

如果您的列是动态的,则需要使用 动态 交叉表。您还应该考虑在您的“演示”层中执行此操作,即 excel 或您将其移交的任何内容。

当 mytable 中的某些东西两次出现在桶上时,你应该考虑你想要什么(这个解决方案会增加价格)

with myTable ( item,startdate,enddate,price) as 
(  
  select  'AAAA' ,CAST('2020-03-16' AS DATE),CAST('2020-03-19' AS DATE),50 union all
  select  'AAAA' ,'2020-04-16','2020-04-19',70 union all
  select  'BBB' ,'2020-03-16','2020-03-19',20 union all
  select  'BBB' ,'2020-04-16','2020-04-19',90 union all
  select  'CCC' ,'2020-03-16','2020-03-29',45 union all
  select  'CCC' ,'2020-04-16','2020-04-19',120
),

itemTable ( item) as 
(  
  select  'AAAA'  union all
  select  'BBB'  union all
   select  'CCC' 
)
,DateTable ( dateItem) as 
(  
  select  CAST('2020-03-16' AS DATE)  union all
  select  '2020-04-19'  union all
  select  '2020-03-20' 
)


SELECT item,
[2020-03-16],[2020-04-19], [2020-03-20]
FROM
(
select item, dateitem, price from myTable 
inner join datetable on datetable.dateItem between mytable.startdate and myTable.enddate
) As Src
PIVOT 
( 
SUM(price)
FOR
dateitem IN ([2020-03-16],[2020-03-20],[2020-04-19])
) as P
IF OBJECT_ID('tempdb..#myTable', 'U') IS NOT NULL 
DROP TABLE #myTable;
IF OBJECT_ID('tempdb..#itemTable', 'U') IS NOT NULL 
DROP TABLE #itemTable;
IF OBJECT_ID('tempdb..#DateTable', 'U') IS NOT NULL 
DROP TABLE #DateTable;

CREATE TABLE #myTable (
    item VARCHAR(MAX) NOT NULL,
    startdate DATE NOT NULL,
    enddate DATE NOT NULL,
    price INT NOT NULL DEFAULT(0)
    );

INSERT #myTable (item, startdate, enddate, price) VALUES
    ('AAAA' ,CAST('2020-03-16' AS DATE),CAST('2020-03-19' AS DATE),50),
    ('AAAA' ,'2020-04-16','2020-04-19',70), 
    ('BBB' ,'2020-03-16','2020-03-19',20),
    ('BBB' ,'2020-04-16','2020-04-19',90),
    ('CCC' ,'2020-03-16','2020-03-29',45),
    ('CCC' ,'2020-04-16','2020-04-19',120)


CREATE TABLE #itemTable ( 
    item VARCHAR(MAX) NOT NULL
)

INSERT #itemTable (item) VALUES
    ('AAAA'), 
    ('BBB'),
    ('CCC')

CREATE TABLE #DateTable (  
    dateItem DATE NOT NULL
)

INSERT #DateTable (dateItem) VALUES
    (CAST('2020-03-16' AS DATE)), 
    (CAST('2020-04-19' AS DATE)),
    (CAST('2020-03-20' AS DATE)),
    (CAST('2020-03-21' AS DATE)),
    (CAST('2021-03-21' AS DATE)),
    (CAST('2022-03-21' AS DATE))


Declare @DynamicCol nvarchar(max),@DynamicColNull nvarchar(max)
        ,@Sql nvarchar(max)

SELECT @DynamicColNull=STUFF((SELECT DISTINCT ', '+'ISNULL('+QUOTENAME(dateItem),','+'''0'''+') As '+QUOTENAME(dateItem)
                        FROM #DateTable FOR XML PATH ('')),1,2,'')

SELECT @DynamicCol=STUFF((SELECT DISTINCT ', '+QUOTENAME(dateItem) FROM #DateTable FOR XML PATH ('')),1,2,'')

SET @Sql='SELECT [item], '+@DynamicColNull+' From
            (   
            select item, dateitem, price from #myTable 
            inner join #datetable on #datetable.dateItem between #mytable.startdate and #myTable.enddate
            )
            AS Src
            PIVOT
            (
            SUM(price) FOR [dateitem] IN ('+@DynamicCol+')
            )AS Pvt'
PRINT @Sql
EXEC(@Sql)