我的桌子看起来像这样:
ID brand version stock date
1 AA AAA 50 2019-11-11
1 AA AAA 52 2019-11-12
1 AA AAA 49 2019-11-13
...
2 BB BBB 30 2019-11-11
2 BB BBB 31 2019-11-12
2 BB BBB 31 2019-11-13
...
基本上,日期列是动态的,因为我使用以下方法提取了从现在开始的最近14天:
select id, brand, version, stock, date, DATEADD(DAY, -8, getdate()) as date_add
from myTable
where date > date_add
意味着日期之后一周将不同于现在,所以我的问题是如何转置此动态表?因为我只知道使用“ case..when”的技巧,但是在这种情况下它不起作用。
我想要的输出将是:
ID brand version 2019-11-11 2019-11-12 2019-11-13
1 AA AAA 50 52 49 ...
2 BB BBB 30 31 31 ...
我已经搜索了类似的问题,但是只有将SQL Server用于动态转置方式的答案。
我该如何处理?谢谢!
答案 0 :(得分:0)
答案 1 :(得分:0)
您可以使用以下代码:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'SUM(CASE WHEN action = "',
action,'" AND ',
(CASE WHEN pagecount IS NOT NULL
THEN CONCAT("pagecount = ",pagecount)
ELSE pagecount IS NULL END),
' THEN 1 ELSE 0 end) AS ',
action, IFNULL(pagecount,'')
)
)
INTO @sql
FROM
t;
SET @sql = CONCAT('SELECT company_name, ', @sql, '
FROM t
GROUP BY company_name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
它来自同一链接,并且不使用in命令。它构建了一个动态字符串,其中包含来自透视列的数据